84 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			84 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Python
		
	
	
	
import os.path
 | 
						|
import subprocess
 | 
						|
import sys
 | 
						|
import textwrap
 | 
						|
from contextlib import contextmanager
 | 
						|
from string import ascii_lowercase
 | 
						|
 | 
						|
import py.path
 | 
						|
 | 
						|
from _pytest import pytester
 | 
						|
 | 
						|
 | 
						|
@contextmanager
 | 
						|
def subst_path_windows(filename):
 | 
						|
    for c in ascii_lowercase[7:]:  # Create a subst drive from H-Z.
 | 
						|
        c += ":"
 | 
						|
        if not os.path.exists(c):
 | 
						|
            drive = c
 | 
						|
            break
 | 
						|
    else:
 | 
						|
        raise AssertionError("Unable to find suitable drive letter for subst.")
 | 
						|
 | 
						|
    directory = filename.dirpath()
 | 
						|
    basename = filename.basename
 | 
						|
 | 
						|
    args = ["subst", drive, str(directory)]
 | 
						|
    subprocess.check_call(args)
 | 
						|
    assert os.path.exists(drive)
 | 
						|
    try:
 | 
						|
        filename = py.path.local(drive) / basename
 | 
						|
        yield filename
 | 
						|
    finally:
 | 
						|
        args = ["subst", "/D", drive]
 | 
						|
        subprocess.check_call(args)
 | 
						|
 | 
						|
 | 
						|
@contextmanager
 | 
						|
def subst_path_linux(filename):
 | 
						|
    directory = filename.dirpath()
 | 
						|
    basename = filename.basename
 | 
						|
 | 
						|
    target = directory / ".." / "sub2"
 | 
						|
    os.symlink(str(directory), str(target), target_is_directory=True)
 | 
						|
    try:
 | 
						|
        filename = target / basename
 | 
						|
        yield filename
 | 
						|
    finally:
 | 
						|
        # We don't need to unlink (it's all in the tempdir).
 | 
						|
        pass
 | 
						|
 | 
						|
 | 
						|
def test_link_resolve(testdir: pytester.Testdir) -> None:
 | 
						|
    """See: https://github.com/pytest-dev/pytest/issues/5965."""
 | 
						|
    sub1 = testdir.mkpydir("sub1")
 | 
						|
    p = sub1.join("test_foo.py")
 | 
						|
    p.write(
 | 
						|
        textwrap.dedent(
 | 
						|
            """
 | 
						|
        import pytest
 | 
						|
        def test_foo():
 | 
						|
            raise AssertionError()
 | 
						|
        """
 | 
						|
        )
 | 
						|
    )
 | 
						|
 | 
						|
    subst = subst_path_linux
 | 
						|
    if sys.platform == "win32":
 | 
						|
        subst = subst_path_windows
 | 
						|
 | 
						|
    with subst(p) as subst_p:
 | 
						|
        result = testdir.runpytest(str(subst_p), "-v")
 | 
						|
        # i.e.: Make sure that the error is reported as a relative path, not as a
 | 
						|
        # resolved path.
 | 
						|
        # See: https://github.com/pytest-dev/pytest/issues/5965
 | 
						|
        stdout = result.stdout.str()
 | 
						|
        assert "sub1/test_foo.py" not in stdout
 | 
						|
 | 
						|
        # i.e.: Expect drive on windows because we just have drive:filename, whereas
 | 
						|
        # we expect a relative path on Linux.
 | 
						|
        expect = (
 | 
						|
            "*{}*".format(subst_p) if sys.platform == "win32" else "*sub2/test_foo.py*"
 | 
						|
        )
 | 
						|
        result.stdout.fnmatch_lines([expect])
 |