Files
MoviePilot/tests/test_string_compat.py

121 lines
3.6 KiB
Python

import importlib
import inspect
from lxml import etree
from app.sdk.string import StringUtils
EXPECTED_METHODS = {
"clear",
"clear_file_name",
"clear_upper",
"compare_version",
"count_words",
"diff_time_str",
"escape_markdown",
"find_common_prefix",
"format_ep",
"format_size",
"format_timestamp",
"generate_random_str",
"get_base_url",
"get_domain_address",
"get_idlist",
"get_keyword",
"get_time",
"get_url_domain",
"get_url_host",
"get_url_netloc",
"get_url_sld",
"is_all_chinese",
"is_chinese",
"is_english_word",
"is_japanese",
"is_korean",
"is_link",
"is_magnet_link",
"is_media_title_like",
"is_number",
"is_valid_html_element",
"md5_hash",
"natural_sort_key",
"num_filesize",
"safe_strip",
"split_text",
"str_amount",
"str_filesize",
"str_float",
"str_from_cookiejar",
"str_int",
"str_secends",
"str_series",
"str_timehours",
"str_timelong",
"str_title",
"str_to_timestamp",
"to_bool",
"unify_datetime_str",
"url_equal",
}
def test_string_utils_keeps_complete_plugin_method_surface():
"""SDK 门面必须保留拆分前全部静态方法名称。"""
assert EXPECTED_METHODS <= set(dir(StringUtils))
def test_legacy_string_modules_share_sdk_facade_identity():
"""旧 utils/domain 路径与 SDK 应解析到同一个轻量兼容模块。"""
sdk_module = importlib.import_module("app.sdk.string")
legacy_utils = importlib.import_module("app.utils.string")
legacy_domain = importlib.import_module("app.domain.string")
assert legacy_utils is sdk_module
assert legacy_domain is sdk_module
assert legacy_utils.StringUtils is StringUtils
assert legacy_domain.StringUtils is StringUtils
def test_string_utils_preserves_legacy_keyword_arguments():
"""插件按旧参数名调用时应正确转交到拆分后的实现。"""
assert StringUtils.clear(text="A.B C", replace_word="-", allow_space=True) == "A-B C"
assert StringUtils.str_filesize(size=1024 ** 3, pre=2) == "1.0G"
assert StringUtils.url_equal(url1="https://www.example.com", url2="example.com") is True
assert StringUtils.generate_random_str(randomlength=8)
assert StringUtils.to_bool(text="", default_val=True) is True
assert StringUtils.str_amount(amount=1234, curr="¥") == "¥1,234"
assert StringUtils.get_domain_address(
address="example.com:8080", prefix=True
) == ("http://example.com", 8080)
assert StringUtils.compare_version(
v1="1.2.0", compare_type="<", v2="1.3.0"
) is True
def test_string_utils_preserves_legacy_method_signatures():
"""反射静态方法签名时也应继续看到插件熟悉的旧参数名。"""
assert list(inspect.signature(StringUtils.clear).parameters) == [
"text",
"replace_word",
"allow_space",
]
assert list(inspect.signature(StringUtils.compare_version).parameters) == [
"v1",
"compare_type",
"v2",
"verbose",
]
def test_string_utils_routes_representative_capabilities():
"""容量、站点、媒体、剧集、种子和 DOM 能力应保持历史结果。"""
assert StringUtils.num_filesize("10.150 TB") == 11160043021926
assert StringUtils.get_url_domain("https://u2.dmhy.org/torrents.php") == "u2.dmhy.org"
assert StringUtils.is_media_title_like("The Office S01E01") is True
assert StringUtils.format_ep([1, 2, 3, 5]) == "E01-E03、E05"
assert StringUtils.is_magnet_link("magnet:?xt=urn:btih:abc") is True
assert StringUtils.is_valid_html_element(
etree.HTML("<html><body></body></html>")
) is True