Files
MoviePilot/tests/test_telegram_urllib3_compat.py

113 lines
3.9 KiB
Python
Raw 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.
import importlib
import sys
from types import SimpleNamespace
import pytest
def test_ensure_urllib3_header_param_compat_adds_best_available_alias(monkeypatch):
"""urllib3 future 缺少旧别名时,应补齐最接近的新入口。"""
from app.modules.telegram.compat import ensure_urllib3_header_param_compat
def multipart_formatter(name, value):
return f"multipart:{name}={value}"
def rfc2231_formatter(name, value):
return f"rfc2231:{name}={value}"
fake_fields = SimpleNamespace(
format_multipart_header_param=multipart_formatter,
format_header_param_rfc2231=rfc2231_formatter,
)
fake_urllib3 = SimpleNamespace(fields=fake_fields)
monkeypatch.setitem(sys.modules, "urllib3", fake_urllib3)
ensure_urllib3_header_param_compat()
assert fake_fields.format_header_param is multipart_formatter
def test_ensure_urllib3_header_param_compat_prefers_html5_formatter(monkeypatch):
"""旧版本 urllib3 的 html5 formatter 存在时,应优先保持原别名语义。"""
from app.modules.telegram.compat import ensure_urllib3_header_param_compat
def html5_formatter(name, value):
return f"html5:{name}={value}"
def multipart_formatter(name, value):
return f"multipart:{name}={value}"
fake_fields = SimpleNamespace(
format_header_param_html5=html5_formatter,
format_multipart_header_param=multipart_formatter,
)
fake_urllib3 = SimpleNamespace(fields=fake_fields)
monkeypatch.setitem(sys.modules, "urllib3", fake_urllib3)
ensure_urllib3_header_param_compat()
assert fake_fields.format_header_param is html5_formatter
def test_ensure_urllib3_header_param_compat_keeps_existing_formatter(monkeypatch):
"""已有 format_header_param 时不应覆盖,避免改变 urllib3 正常行为。"""
from app.modules.telegram.compat import ensure_urllib3_header_param_compat
def existing_formatter(name, value):
return f"existing:{name}={value}"
def rfc2231_formatter(name, value):
return f"fallback:{name}={value}"
fake_fields = SimpleNamespace(
format_header_param=existing_formatter,
format_header_param_rfc2231=rfc2231_formatter,
)
fake_urllib3 = SimpleNamespace(fields=fake_fields)
monkeypatch.setitem(sys.modules, "urllib3", fake_urllib3)
ensure_urllib3_header_param_compat()
assert fake_fields.format_header_param is existing_formatter
def test_ensure_urllib3_header_param_compat_noops_without_fallback(monkeypatch):
"""没有任何可用 fallback 时保持 no-op让原始导入错误暴露。"""
from app.modules.telegram.compat import ensure_urllib3_header_param_compat
fake_fields = SimpleNamespace()
fake_urllib3 = SimpleNamespace(fields=fake_fields)
monkeypatch.setitem(sys.modules, "urllib3", fake_urllib3)
ensure_urllib3_header_param_compat()
assert not hasattr(fake_fields, "format_header_param")
def test_telegram_module_imports_when_urllib3_header_alias_missing(monkeypatch):
"""导入 Telegram 模块前旧别名缺失时,应先补齐再导入 telebot。"""
from urllib3 import fields
if not any(
hasattr(fields, name)
for name in (
"format_header_param_html5",
"format_multipart_header_param",
"format_header_param_rfc2231",
)
):
pytest.skip("urllib3 has no compatible header formatter fallback")
monkeypatch.delattr(fields, "format_header_param", raising=False)
for module_name in list(sys.modules):
if (
module_name == "app.modules.telegram.telegram"
or module_name.startswith("telebot")
):
monkeypatch.delitem(sys.modules, module_name, raising=False)
telegram_module = importlib.import_module("app.modules.telegram.telegram")
assert telegram_module.Telegram
assert hasattr(fields, "format_header_param")