Merge pull request #4738 from pstradomski/master
Fix "ValueError: Plugin already registered" exceptions when running in build directories that symlink to actual source.
This commit is contained in:
		
						commit
						32c6d4f603
					
				|  | @ -0,0 +1 @@ | ||||||
|  | Fix "ValueError: Plugin already registered" exceptions when running in build directories that symlink to actual source. | ||||||
|  | @ -408,7 +408,10 @@ class PytestPluginManager(PluginManager): | ||||||
|                 continue |                 continue | ||||||
|             conftestpath = parent.join("conftest.py") |             conftestpath = parent.join("conftest.py") | ||||||
|             if conftestpath.isfile(): |             if conftestpath.isfile(): | ||||||
|                 mod = self._importconftest(conftestpath) |                 # Use realpath to avoid loading the same conftest twice | ||||||
|  |                 # with build systems that create build directories containing | ||||||
|  |                 # symlinks to actual files. | ||||||
|  |                 mod = self._importconftest(conftestpath.realpath()) | ||||||
|                 clist.append(mod) |                 clist.append(mod) | ||||||
|         self._dirpath2confmods[directory] = clist |         self._dirpath2confmods[directory] = clist | ||||||
|         return clist |         return clist | ||||||
|  |  | ||||||
|  | @ -244,6 +244,42 @@ def test_conftest_symlink(testdir): | ||||||
|     assert result.ret == EXIT_OK |     assert result.ret == EXIT_OK | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | @pytest.mark.skipif( | ||||||
|  |     not hasattr(py.path.local, "mksymlinkto"), | ||||||
|  |     reason="symlink not available on this platform", | ||||||
|  | ) | ||||||
|  | def test_conftest_symlink_files(testdir): | ||||||
|  |     """Check conftest.py loading when running in directory with symlinks.""" | ||||||
|  |     real = testdir.tmpdir.mkdir("real") | ||||||
|  |     source = { | ||||||
|  |         "app/test_foo.py": "def test1(fixture): pass", | ||||||
|  |         "app/__init__.py": "", | ||||||
|  |         "app/conftest.py": textwrap.dedent( | ||||||
|  |             """ | ||||||
|  |             import pytest | ||||||
|  | 
 | ||||||
|  |             print("conftest_loaded") | ||||||
|  | 
 | ||||||
|  |             @pytest.fixture | ||||||
|  |             def fixture(): | ||||||
|  |                 print("fixture_used") | ||||||
|  |             """ | ||||||
|  |         ), | ||||||
|  |     } | ||||||
|  |     testdir.makepyfile(**{"real/%s" % k: v for k, v in source.items()}) | ||||||
|  | 
 | ||||||
|  |     # Create a build directory that contains symlinks to actual files | ||||||
|  |     # but doesn't symlink actual directories. | ||||||
|  |     build = testdir.tmpdir.mkdir("build") | ||||||
|  |     build.mkdir("app") | ||||||
|  |     for f in source: | ||||||
|  |         build.join(f).mksymlinkto(real.join(f)) | ||||||
|  |     build.chdir() | ||||||
|  |     result = testdir.runpytest("-vs", "app/test_foo.py") | ||||||
|  |     result.stdout.fnmatch_lines(["*conftest_loaded*", "PASSED"]) | ||||||
|  |     assert result.ret == EXIT_OK | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| def test_no_conftest(testdir): | def test_no_conftest(testdir): | ||||||
|     testdir.makeconftest("assert 0") |     testdir.makeconftest("assert 0") | ||||||
|     result = testdir.runpytest("--noconftest") |     result = testdir.runpytest("--noconftest") | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue