diff --git a/tests/test_env.py b/tests/test_env.py index 04f7733..eb883b5 100644 --- a/tests/test_env.py +++ b/tests/test_env.py @@ -779,11 +779,20 @@ def child(pytester: pytest.Pytester, mocker: MockerFixture) -> Path: [pytest.param(False, id="omitted"), pytest.param(True, id="empty")], ) @pytest.mark.parametrize( - "extend", - [pytest.param(False, id="config-only"), pytest.param(True, id="cli-extend")], + "scenario", + [ + pytest.param((False, False), id="config-only-unset"), + pytest.param((False, True), id="config-only-set"), + pytest.param((True, False), id="cli-extend-unset"), + pytest.param((True, True), id="cli-extend-set"), + ], ) def test_native_env_files_override_ini( - pytester: pytest.Pytester, config_name: str, empty_env_files: bool, extend: bool + pytester: pytest.Pytester, + mocker: MockerFixture, + config_name: str, + empty_env_files: bool, + scenario: tuple[bool, bool], ) -> None: (pytester.path / "fallback.env").write_text("INHERITED=from_ini\n", encoding="utf-8") (pytester.path / "cli.env").write_text("FROM_CLI=from_cli\n", encoding="utf-8") @@ -795,21 +804,49 @@ def test_native_env_files_override_ini( else: native += '\n[pytest]\nenv_files = ["fallback.env"]\n' (pytester.path / config_name).write_text(native, encoding="utf-8") - expected_env: Final[tuple[str | None, str | None]] = ( + pass_python_env: Final[bool] = scenario[1] + pythonpath_marker: Final[str] = str(pytester.path / "pythonpath_marker") + python_env: Final[dict[str, str]] = ( + { + "PYTHONPATH": os.pathsep.join(filter(None, (os.environ.get("PYTHONPATH"), pythonpath_marker))), + "PYTHONDONTWRITEBYTECODE": "1", + } + if pass_python_env + else {} + ) + extend: Final[bool] = scenario[0] + expected_env: Final[tuple[str | None, str | None, bool, str | None]] = ( None if empty_env_files else "from_ini", "from_cli" if extend else None, + pass_python_env, + python_env.get("PYTHONDONTWRITEBYTECODE"), ) pytester.makepyfile( test_env=dedent(f"""\ import os def test_env() -> None: - assert (os.environ.get("INHERITED"), os.environ.get("FROM_CLI")) == {expected_env!r} + assert ( + os.environ.get("INHERITED"), + os.environ.get("FROM_CLI"), + {pythonpath_marker!r} in os.environ["PYTHONPATH"].split(os.pathsep), + os.environ.get("PYTHONDONTWRITEBYTECODE"), + ) == {expected_env!r} """), ) - new_env: Final[dict[str, str]] = {"PYTEST_DISABLE_PLUGIN_AUTOLOAD": "1", "PYTEST_PLUGINS": "pytest_env.plugin"} - with mock.patch.dict(os.environ, new_env, clear=True): - pytester.runpytest_subprocess(*(["--envfile", "+cli.env"] if extend else [])).assert_outcomes(passed=1) + system_env: Final[dict[str, str]] = {key: os.environ[key] for key in ("SYSTEMROOT", "WINDIR") if key in os.environ} + mocker.patch.dict(os.environ, python_env, clear=True) + mocker.patch.dict( + os.environ, + { + **system_env, + **{key: os.environ[key] for key in ("PYTHONPATH", "PYTHONDONTWRITEBYTECODE") if key in os.environ}, + "PYTEST_DISABLE_PLUGIN_AUTOLOAD": "1", + "PYTEST_PLUGINS": "pytest_env.plugin", + }, + clear=True, + ) + pytester.runpytest_subprocess(*(["--envfile", "+cli.env"] if extend else [])).assert_outcomes(passed=1) @pytest.mark.parametrize(