Fix collection of direct symlinked files not in python_files

Fixes https://github.com/pytest-dev/pytest/issues/4325.
This commit is contained in:
Daniel Hahler 2018-11-08 01:24:38 +01:00
parent 7ab3d818f0
commit be15ad8d25
4 changed files with 58 additions and 2 deletions

View File

@ -0,0 +1 @@
Fix ``item.nodeid`` with resolved symlinks.

View File

@ -0,0 +1 @@
Fix collection of direct symlinked files, where the target does not match ``python_files``.

View File

@ -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):

View File

@ -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