fix 4425: resolve --basetemp to absolute paths

This commit is contained in:
Ronny Pfannschmidt 2018-11-20 13:47:40 +01:00
parent 45c33c4e05
commit fc61bdd907
4 changed files with 40 additions and 6 deletions

View File

@ -0,0 +1 @@
Ensure we resolve the absolute path when the given ``--basetemp`` is a relative path.

View File

@ -13,8 +13,9 @@ import six
import pytest import pytest
from _pytest.fixtures import fixture from _pytest.fixtures import fixture
from _pytest.pathlib import Path
RE_IMPORT_ERROR_NAME = re.compile("^No module named (.*)$") RE_IMPORT_ERROR_NAME = re.compile(r"^No module named (.*)$")
@fixture @fixture
@ -267,6 +268,9 @@ class MonkeyPatch(object):
self._cwd = os.getcwd() self._cwd = os.getcwd()
if hasattr(path, "chdir"): if hasattr(path, "chdir"):
path.chdir() path.chdir()
elif isinstance(path, Path):
# modern python uses the fspath protocol here LEGACY
os.chdir(str(path))
else: else:
os.chdir(path) os.chdir(path)

View File

@ -26,7 +26,9 @@ class TempPathFactory(object):
The base directory can be configured using the ``--basetemp`` option.""" The base directory can be configured using the ``--basetemp`` option."""
_given_basetemp = attr.ib() _given_basetemp = attr.ib(
convert=attr.converters.optional(lambda p: Path(p).resolve())
)
_trace = attr.ib() _trace = attr.ib()
_basetemp = attr.ib(default=None) _basetemp = attr.ib(default=None)
@ -53,7 +55,7 @@ class TempPathFactory(object):
""" return base temporary directory. """ """ return base temporary directory. """
if self._basetemp is None: if self._basetemp is None:
if self._given_basetemp is not None: if self._given_basetemp is not None:
basetemp = Path(self._given_basetemp) basetemp = self._given_basetemp
ensure_reset_dir(basetemp) ensure_reset_dir(basetemp)
else: else:
from_env = os.environ.get("PYTEST_DEBUG_TEMPROOT") from_env = os.environ.get("PYTEST_DEBUG_TEMPROOT")

View File

@ -4,6 +4,7 @@ from __future__ import print_function
import sys import sys
import attr
import six import six
import pytest import pytest
@ -25,12 +26,29 @@ def test_ensuretemp(recwarn):
assert d1.check(dir=1) assert d1.check(dir=1)
@attr.s
class FakeConfig(object):
basetemp = attr.ib()
trace = attr.ib(default=None)
@property
def trace(self):
return self
def get(self, key):
return lambda *k: None
@property
def option(self):
return self
class TestTempdirHandler(object): class TestTempdirHandler(object):
def test_mktemp(self, testdir): def test_mktemp(self, tmp_path):
from _pytest.tmpdir import TempdirFactory, TempPathFactory from _pytest.tmpdir import TempdirFactory, TempPathFactory
config = testdir.parseconfig() config = FakeConfig(tmp_path)
config.option.basetemp = testdir.mkdir("hello")
t = TempdirFactory(TempPathFactory.from_config(config)) t = TempdirFactory(TempPathFactory.from_config(config))
tmp = t.mktemp("world") tmp = t.mktemp("world")
assert tmp.relto(t.getbasetemp()) == "world0" assert tmp.relto(t.getbasetemp()) == "world0"
@ -40,6 +58,15 @@ class TestTempdirHandler(object):
assert tmp2.relto(t.getbasetemp()).startswith("this") assert tmp2.relto(t.getbasetemp()).startswith("this")
assert tmp2 != tmp assert tmp2 != tmp
@pytest.mark.issue(4425)
def test_tmppath_relative_basetemp_absolute(self, tmp_path, monkeypatch):
from _pytest.tmpdir import TempPathFactory
monkeypatch.chdir(tmp_path)
config = FakeConfig("hello")
t = TempPathFactory.from_config(config)
assert t.getbasetemp() == (tmp_path / "hello")
class TestConfigTmpdir(object): class TestConfigTmpdir(object):
def test_getbasetemp_custom_removes_old(self, testdir): def test_getbasetemp_custom_removes_old(self, testdir):