Fix collection of direct symlinked files not in python_files
Fixes https://github.com/pytest-dev/pytest/issues/4325.
This commit is contained in:
parent
7ab3d818f0
commit
be15ad8d25
|
@ -0,0 +1 @@
|
||||||
|
Fix ``item.nodeid`` with resolved symlinks.
|
|
@ -0,0 +1 @@
|
||||||
|
Fix collection of direct symlinked files, where the target does not match ``python_files``.
|
|
@ -488,7 +488,7 @@ class Session(nodes.FSCollector):
|
||||||
from _pytest.python import Package
|
from _pytest.python import Package
|
||||||
|
|
||||||
names = self._parsearg(arg)
|
names = self._parsearg(arg)
|
||||||
argpath = names.pop(0).realpath()
|
argpath = names.pop(0)
|
||||||
|
|
||||||
# Start with a Session root, and delve to argpath item (dir or file)
|
# Start with a Session root, and delve to argpath item (dir or file)
|
||||||
# and stack all Packages found on the way.
|
# and stack all Packages found on the way.
|
||||||
|
@ -636,7 +636,7 @@ class Session(nodes.FSCollector):
|
||||||
"file or package not found: " + arg + " (missing __init__.py?)"
|
"file or package not found: " + arg + " (missing __init__.py?)"
|
||||||
)
|
)
|
||||||
raise UsageError("file not found: " + arg)
|
raise UsageError("file not found: " + arg)
|
||||||
parts[0] = path
|
parts[0] = path.realpath()
|
||||||
return parts
|
return parts
|
||||||
|
|
||||||
def matchnodes(self, matching, names):
|
def matchnodes(self, matching, names):
|
||||||
|
|
|
@ -6,6 +6,8 @@ import pprint
|
||||||
import sys
|
import sys
|
||||||
import textwrap
|
import textwrap
|
||||||
|
|
||||||
|
import py
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
from _pytest.main import _in_venv
|
from _pytest.main import _in_venv
|
||||||
from _pytest.main import EXIT_NOTESTSCOLLECTED
|
from _pytest.main import EXIT_NOTESTSCOLLECTED
|
||||||
|
@ -1051,3 +1053,55 @@ def test_collect_handles_raising_on_dunder_class(testdir):
|
||||||
result = testdir.runpytest()
|
result = testdir.runpytest()
|
||||||
assert result.ret == 0
|
assert result.ret == 0
|
||||||
result.stdout.fnmatch_lines(["*1 passed in*"])
|
result.stdout.fnmatch_lines(["*1 passed in*"])
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.skipif(
|
||||||
|
not hasattr(py.path.local, "mksymlinkto"),
|
||||||
|
reason="symlink not available on this platform",
|
||||||
|
)
|
||||||
|
def test_collect_symlink_file_arg(testdir):
|
||||||
|
"""Test that collecting a direct symlink, where the target does not match python_files works (#4325)."""
|
||||||
|
real = testdir.makepyfile(
|
||||||
|
real="""
|
||||||
|
def test_nodeid(request):
|
||||||
|
assert request.node.nodeid == "real.py::test_nodeid"
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
symlink = testdir.tmpdir.join("symlink.py")
|
||||||
|
symlink.mksymlinkto(real)
|
||||||
|
result = testdir.runpytest("-v", symlink)
|
||||||
|
result.stdout.fnmatch_lines(["real.py::test_nodeid PASSED*", "*1 passed in*"])
|
||||||
|
assert result.ret == 0
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.skipif(
|
||||||
|
not hasattr(py.path.local, "mksymlinkto"),
|
||||||
|
reason="symlink not available on this platform",
|
||||||
|
)
|
||||||
|
def test_collect_symlink_out_of_tree(testdir):
|
||||||
|
"""Test collection of symlink via out-of-tree rootdir."""
|
||||||
|
sub = testdir.tmpdir.join("sub")
|
||||||
|
real = sub.join("test_real.py")
|
||||||
|
real.write(
|
||||||
|
textwrap.dedent(
|
||||||
|
"""
|
||||||
|
def test_nodeid(request):
|
||||||
|
# Should not contain sub/ prefix.
|
||||||
|
assert request.node.nodeid == "test_real.py::test_nodeid"
|
||||||
|
"""
|
||||||
|
),
|
||||||
|
ensure=True,
|
||||||
|
)
|
||||||
|
|
||||||
|
out_of_tree = testdir.tmpdir.join("out_of_tree").ensure(dir=True)
|
||||||
|
symlink_to_sub = out_of_tree.join("symlink_to_sub")
|
||||||
|
symlink_to_sub.mksymlinkto(sub)
|
||||||
|
sub.chdir()
|
||||||
|
result = testdir.runpytest("-vs", "--rootdir=%s" % sub, symlink_to_sub)
|
||||||
|
result.stdout.fnmatch_lines(
|
||||||
|
[
|
||||||
|
# Should not contain "sub/"!
|
||||||
|
"test_real.py::test_nodeid PASSED"
|
||||||
|
]
|
||||||
|
)
|
||||||
|
assert result.ret == 0
|
||||||
|
|
Loading…
Reference in New Issue