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])
 |