diff --git a/tests/conftest.py b/tests/conftest.py index 6dee1e1b032..5515651419a 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -34,6 +34,7 @@ from tests.helpers import TestLocker from tests.helpers import TestRepository from tests.helpers import get_package +from tests.helpers import isolated_environment from tests.helpers import mock_clone from tests.helpers import mock_download @@ -246,27 +247,19 @@ def _pep517_metadata(cls: PackageInfo, path: Path) -> PackageInfo: @pytest.fixture def environ() -> Iterator[None]: - original_environ = dict(os.environ) - - yield - - os.environ.clear() - os.environ.update(original_environ) + with isolated_environment(): + yield @pytest.fixture(autouse=True) def isolate_environ() -> Iterator[None]: """Ensure the environment is isolated from user configuration.""" - original_environ = dict(os.environ) - - for var in os.environ: - if var.startswith("POETRY_"): - del os.environ[var] - - yield + with isolated_environment(): + for var in os.environ: + if var.startswith("POETRY_") or var in {"PYTHONPATH", "VIRTUAL_ENV"}: + del os.environ[var] - os.environ.clear() - os.environ.update(original_environ) + yield @pytest.fixture(autouse=True) diff --git a/tests/helpers.py b/tests/helpers.py index 9992c0e83dc..1969873263b 100644 --- a/tests/helpers.py +++ b/tests/helpers.py @@ -1,5 +1,6 @@ from __future__ import annotations +import contextlib import os import re import shutil @@ -9,6 +10,7 @@ from pathlib import Path from typing import TYPE_CHECKING from typing import Any +from typing import Iterator from poetry.core.masonry.utils.helpers import escape_name from poetry.core.masonry.utils.helpers import escape_version @@ -230,3 +232,21 @@ def find_links_for_package(self, package: Package) -> list[Link]: f"-{escape_version(package.version.text)}-py2.py3-none-any.whl" ) ] + + +@contextlib.contextmanager +def isolated_environment( + environ: dict[str, Any] | None = None, clear: bool = False +) -> Iterator[None]: + original_environ = dict(os.environ) + + if clear: + os.environ.clear() + + if environ: + os.environ.update(environ) + + yield + + os.environ.clear() + os.environ.update(original_environ)