testing: Add test to assert path hooks ignored in sys.path

This commit is contained in:
Jeremy Hiatt
2024-02-28 15:11:07 -08:00
parent 51ef94439c
commit 79fb6ff9c0

View File

@@ -1,3 +1,5 @@
import pathlib
import tempfile
import unittest.mock import unittest.mock
from typing import List from typing import List
@@ -191,6 +193,43 @@ class TestRemoteControl:
control.loop_once() control.loop_once()
assert control.failures assert control.failures
def test_ignore_sys_path_hook_entry(
self, pytester: pytest.Pytester, monkeypatch: pytest.MonkeyPatch
) -> None:
# Modifying sys.path as seen by the worker process is a bit tricky,
# because any changes made in the current process do not carry over.
# However, we can leverage the `sitecustomize` behavior to run arbitrary
# code when the subprocess interpreter is starting up. We just need to
# install our module in the search path, which we can accomplish by
# adding a temporary directory to PYTHONPATH.
tmpdir = tempfile.TemporaryDirectory()
with open(pathlib.Path(tmpdir.name) / "sitecustomize.py", "w") as custom:
print(
textwrap.dedent(
"""
import sys
sys.path.append('dummy.__path_hook__')
"""
),
file=custom,
)
monkeypatch.setenv("PYTHONPATH", tmpdir.name, prepend=":")
item = pytester.getitem(
textwrap.dedent(
"""
def test_func():
import sys
assert "dummy.__path_hook__" in sys.path
"""
)
)
control = RemoteControl(item.config)
control.setup()
topdir, failures = control.runsession()[:2]
assert not failures
class TestLooponFailing: class TestLooponFailing:
def test_looponfail_from_fail_to_ok(self, pytester: pytest.Pytester) -> None: def test_looponfail_from_fail_to_ok(self, pytester: pytest.Pytester) -> None: