Skip to content

Commit

Permalink
Fix collection of direct symlinked files not in python_files
Browse files Browse the repository at this point in the history
  • Loading branch information
blueyed committed Nov 11, 2018
1 parent 7ab3d81 commit be15ad8
Show file tree
Hide file tree
Showing 4 changed files with 58 additions and 2 deletions.
1 change: 1 addition & 0 deletions changelog/4321.bugfix.rst
@@ -0,0 +1 @@
Fix ``item.nodeid`` with resolved symlinks.
1 change: 1 addition & 0 deletions changelog/4325.bugfix.rst
@@ -0,0 +1 @@
Fix collection of direct symlinked files, where the target does not match ``python_files``.
4 changes: 2 additions & 2 deletions src/_pytest/main.py
Expand Up @@ -488,7 +488,7 @@ def _collect(self, arg):
from _pytest.python import Package

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)
# and stack all Packages found on the way.
Expand Down Expand Up @@ -636,7 +636,7 @@ def _parsearg(self, arg):
"file or package not found: " + arg + " (missing __init__.py?)"
)
raise UsageError("file not found: " + arg)
parts[0] = path
parts[0] = path.realpath()
return parts

def matchnodes(self, matching, names):
Expand Down
54 changes: 54 additions & 0 deletions testing/test_collection.py
Expand Up @@ -6,6 +6,8 @@
import sys
import textwrap

import py

import pytest
from _pytest.main import _in_venv
from _pytest.main import EXIT_NOTESTSCOLLECTED
Expand Down Expand Up @@ -1051,3 +1053,55 @@ def test_1():
result = testdir.runpytest()
assert result.ret == 0
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

0 comments on commit be15ad8

Please sign in to comment.