"""Regression for PATH-selected OpenSSL libraries disappearing from the bundle.""" import _ssl import shutil import sys import tempfile import unittest from pathlib import Path from unittest import mock from packaging_native import pin_ssl_binaries, python_ssl_binaries class PythonSslPackagingTest(unittest.TestCase): def test_dependencies_come_from_build_python(self): dependencies = python_ssl_binaries() self.assertTrue(any(name.startswith("libssl") for name, _, _ in dependencies)) self.assertTrue(any(name.startswith("libcrypto") for name, _, _ in dependencies)) for name, source, kind in dependencies: self.assertTrue(Path(source).is_file()) self.assertTrue(Path(source).resolve().is_relative_to(Path(sys.base_prefix).resolve())) self.assertEqual(Path(source).name, name) self.assertEqual(kind, "BINARY") def test_path_collision_is_replaced_and_required_libraries_are_retained(self): verified = python_ssl_binaries() wrong = [(name.upper(), "C:/unrelated-pdf-tool/" + name, "BINARY") for name, _, _ in verified] other = ("_ssl.pyd", str(_ssl.__file__), "EXTENSION") result = pin_ssl_binaries(wrong + [other], verified) self.assertEqual(result, [other] + verified) # The existing unrelated-runtime filter must keep the corrected DLLs. filtered = [item for item in result if ".cache" not in item[1] or Path(item[1]).resolve().is_relative_to(Path(sys.base_prefix).resolve())] self.assertEqual(filtered, result) def test_missing_python_ssl_dependency_fails_before_packaging(self): with tempfile.TemporaryDirectory() as temporary: root = Path(temporary) extension = root / "_ssl.pyd" shutil.copyfile(_ssl.__file__, extension) with mock.patch.object(_ssl, "__file__", str(extension)), mock.patch.object(sys, "base_prefix", str(root)): with self.assertRaisesRegex(RuntimeError, "OpenSSL dependency is missing"): python_ssl_binaries()