Files
MoviePilot/tests/test_main_direct_execution.py
T
jxxghp fe0b444ceb fix(test): stub app.infrastructure.sites in subprocess tests for CI
CI 无站点二进制模块,子进程测试绕过 conftest 垫片导致
test_manifest_aliases_reuse_real_canonical_modules 与
test_main_script_does_not_shadow_stdlib_platform 失败。
在子进程中复用 ensure_sites_stub,并给垫片补 __spec__。
2026-08-14 18:18:06 +08:00

46 lines
1.5 KiB
Python

import os
import subprocess
import sys
from pathlib import Path
PROJECT_ROOT = Path(__file__).parents[1]
MAIN_PATH = PROJECT_ROOT / "app" / "main.py"
def test_main_script_does_not_shadow_stdlib_platform(tmp_path):
"""PyCharm 脚本启动路径不得让 app/platform 遮蔽标准库 platform。"""
probe = "\n".join(
(
"import runpy",
"import sys",
# CI 无 app.infrastructure.sites 二进制模块,先补垫片再执行 main.py(与 conftest 同源);
# 必须在篡改 sys.path / 摘除 platform 之前调用,避免真实模块依赖链误引被遮蔽的 app/platform。
"from app.testing.bootstrap import ensure_sites_stub",
"ensure_sites_stub()",
f"sys.path.insert(0, {str(MAIN_PATH.parent)!r})",
"sys.modules.pop('platform', None)",
f"runpy.run_path({str(MAIN_PATH)!r}, run_name='pycharm_main_probe')",
"import platform",
"assert hasattr(platform, 'python_implementation')",
"assert '/app/platform/' not in str(getattr(platform, '__file__', ''))",
)
)
env = {
**os.environ,
"CONFIG_DIR": str(tmp_path / "config"),
"MOVIEPILOT_AUTO_UPDATE": "off",
}
result = subprocess.run(
[sys.executable, "-c", probe],
cwd=PROJECT_ROOT,
env=env,
capture_output=True,
text=True,
timeout=30,
check=False,
)
assert result.returncode == 0, result.stderr