Files
baiyue-logistics-chat/tests/test_startup.py
T

123 lines
4.9 KiB
Python
Raw Normal View History

"""Exercise the Windows startup entry point without installing or serving anything."""
import os
import shutil
import subprocess
import sys
import tempfile
import unittest
import venv
from pathlib import Path
ROOT = Path(__file__).resolve().parents[1]
@unittest.skipUnless(os.name == "nt", "Windows batch entry point")
class StartupInterpreterTests(unittest.TestCase):
def setUp(self):
self.directory = tempfile.TemporaryDirectory()
self.addCleanup(self.directory.cleanup)
self.sandbox = Path(self.directory.name)
self.repository = self.sandbox / "project with spaces & sign"
self.repository.mkdir()
shutil.copy2(ROOT / "start.bat", self.repository / "start.bat")
self.commands = self.sandbox / "commands"
self.commands.mkdir()
self.other_directory = self.sandbox / "elsewhere"
self.other_directory.mkdir()
self.system_directory = Path(os.environ["SystemRoot"]) / "System32"
self.environment = os.environ.copy()
for name in ("VIRTUAL_ENV", "PYTHONHOME", "PYTHONPATH", "PYLAUNCHER_DRYRUN"):
self.environment.pop(name, None)
self.environment["PYTHONUTF8"] = "1"
self.environment["PATH"] = os.pathsep.join(
str(path) for path in (
self.commands, Path(sys.executable).parent, self.system_directory,
)
)
def create_environment(self, directory):
venv.EnvBuilder(with_pip=False).create(directory)
return directory / "Scripts" / "python.exe"
def create_failed_candidate(self, destination):
# A real signed Windows executable that rejects Python's command-line flags.
destination.parent.mkdir(parents=True, exist_ok=True)
shutil.copy2(self.system_directory / "where.exe", destination)
def diagnose(self):
executable = os.environ.get("COMSPEC", str(self.system_directory / "cmd.exe"))
command = (
subprocess.list2cmdline([executable])
+ ' /d /v:off /c ""'
+ str(self.repository / "start.bat")
+ '" --check-python"'
)
return subprocess.run(
command,
cwd=self.other_directory,
env=self.environment,
capture_output=True,
text=True,
encoding="utf-8",
timeout=15,
)
def assert_selected(self, expected):
result = self.diagnose()
self.assertEqual(result.returncode, 0, result.stdout + result.stderr)
self.assertEqual(
os.path.normcase(str(Path(result.stdout.strip()).resolve())),
os.path.normcase(str(expected.resolve())),
)
return result
def test_active_environment_precedes_project_environment(self):
active = self.sandbox / "active env ! & sign"
expected = self.create_environment(active)
self.create_environment(self.repository / ".venv")
self.environment["VIRTUAL_ENV"] = str(active)
self.assert_selected(expected)
def test_project_environment_is_used_when_no_environment_is_active(self):
expected = self.create_environment(self.repository / ".venv")
self.assert_selected(expected)
def test_failed_active_environment_falls_back_to_project_environment(self):
active = self.sandbox / "failed active environment"
self.create_failed_candidate(active / "Scripts" / "python.exe")
expected = self.create_environment(self.repository / ".venv")
self.environment["VIRTUAL_ENV"] = str(active)
self.assert_selected(expected)
def test_failed_project_environment_falls_back_to_path_python(self):
self.create_failed_candidate(self.repository / ".venv" / "Scripts" / "python.exe")
self.create_failed_candidate(self.commands / "py.exe")
self.assert_selected(Path(sys.executable))
def test_failed_launcher_falls_back_to_path_python_without_launcher_flags(self):
self.create_failed_candidate(self.commands / "py.exe")
self.assert_selected(Path(sys.executable))
def test_no_working_interpreter_reports_failure_without_pausing(self):
self.create_failed_candidate(self.commands / "py.exe")
self.create_failed_candidate(self.commands / "python.exe")
self.environment["PATH"] = os.pathsep.join(
(str(self.commands), str(self.system_directory))
)
result = self.diagnose()
self.assertEqual(result.returncode, 1, result.stdout + result.stderr)
self.assertIn("No working Python 3 interpreter", result.stdout)
def test_diagnostic_mode_leaves_no_application_files(self):
self.create_failed_candidate(self.commands / "py.exe")
self.environment.pop("DEEPSEEK_API_KEY", None)
self.assert_selected(Path(sys.executable))
self.assertEqual({path.name for path in self.repository.iterdir()}, {"start.bat"})
self.assertEqual(list(self.other_directory.iterdir()), [])
if __name__ == "__main__":
unittest.main()