diff --git a/CHANGELOG b/CHANGELOG index 60f3145f0..395100378 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -2,6 +2,9 @@ Changes between 1.3.4 and 1.4.0.dev0 ================================================== +- fix issue109 - sibling conftest.py files will not be loaded. + (and Directory collectors cannot be customized anymore from a Directory's + conftest.py - this needs to happen at least one level up). - introduce (customizable) assertion failure representations (Floris Bruynooghe) - nose-plugin: pass through type-signature failures in setup/teardown functions instead of not calling them (Ed Singleton) diff --git a/py/_plugin/pytest_default.py b/py/_plugin/pytest_default.py index 25e388d0f..3946635ef 100644 --- a/py/_plugin/pytest_default.py +++ b/py/_plugin/pytest_default.py @@ -26,7 +26,8 @@ def pytest_runtest_mainloop(session): return True def pytest_ignore_collect(path, config): - ignore_paths = config.getconftest_pathlist("collect_ignore", path=path) + p = path.dirpath() + ignore_paths = config.getconftest_pathlist("collect_ignore", path=p) ignore_paths = ignore_paths or [] excludeopt = config.getvalue("ignore") if excludeopt: @@ -34,10 +35,6 @@ def pytest_ignore_collect(path, config): return path in ignore_paths def pytest_collect_directory(path, parent): - # XXX reconsider the following comment - # not use parent.Directory here as we generally - # want dir/conftest.py to be able to - # define Directory(dir) already if not parent.recfilter(path): # by default special ".cvs", ... # check if cmdline specified this dir or a subdir directly for arg in parent.collection._argfspaths: @@ -45,8 +42,7 @@ def pytest_collect_directory(path, parent): break else: return - Directory = parent.config._getcollectclass('Directory', path) - return Directory(path, parent=parent) + return parent.Directory(path, parent=parent) def pytest_report_iteminfo(item): return item.reportinfo() diff --git a/py/_test/conftesthandle.py b/py/_test/conftesthandle.py index 04707f473..c496dc233 100644 --- a/py/_test/conftesthandle.py +++ b/py/_test/conftesthandle.py @@ -44,8 +44,9 @@ class Conftest(object): self._path2confmods[None] = self.getconftestmodules(anchor) # let's also consider test* dirs if anchor.check(dir=1): - for x in anchor.listdir(lambda x: x.check(dir=1, dotfile=0)): - self.getconftestmodules(x) + for x in anchor.listdir("test*"): + if x.check(dir=1): + self.getconftestmodules(x) break else: assert 0, "no root of filesystem?" diff --git a/testing/acceptance_test.py b/testing/acceptance_test.py index 0b521eef8..617006eda 100644 --- a/testing/acceptance_test.py +++ b/testing/acceptance_test.py @@ -163,34 +163,31 @@ class TestGeneralUsage: result = testdir.runpython(p, prepend=False) assert not result.ret - @py.test.mark.xfail(reason="http://bitbucket.org/hpk42/py-trunk/issue/109") - def test_sibling_conftest_issue109(self, testdir): - """ - This test is to make sure that the conftest.py of sibling directories is not loaded - if py.test is run for/in one of the siblings directory and those sibling directories - are not packaged together with an __init__.py. See bitbucket issue #109. - """ - for dirname in ['a', 'b']: - testdir.tmpdir.ensure(dirname, dir=True) - testdir.tmpdir.ensure(dirname, '__init__.py') + def test_issue109_sibling_conftests_not_loaded(self, testdir): + sub1 = testdir.tmpdir.mkdir("sub1") + sub2 = testdir.tmpdir.mkdir("sub2") + sub1.join("conftest.py").write("assert 0") + result = testdir.runpytest(sub2) + assert result.ret == 0 + sub2.ensure("__init__.py") + p = sub2.ensure("test_hello.py") + result = testdir.runpytest(p) + assert result.ret == 0 + result = testdir.runpytest(sub1) + assert result.ret != 0 - # To create the conftest.py I would like to use testdir.make*-methods - # but as far as I have seen they can only create files in testdir.tempdir - # Maybe there is a way to explicitly specifiy the directory on which those - # methods work or a completely better way to do that? - backupTmpDir = testdir.tmpdir - testdir.tmpdir = testdir.tmpdir.join(dirname) - testdir.makeconftest(""" - _DIR_NAME = '%s' - def pytest_configure(config): - if config.args and config.args[0] != _DIR_NAME: - raise Exception("py.test run for '" + config.args[0] + "', but '" + _DIR_NAME + "/conftest.py' loaded.") - """ % dirname) - testdir.tmpdir = backupTmpDir - - for dirname, other_dirname in [('a', 'b'), ('b', 'a')]: - result = testdir.runpytest(dirname) - assert result.ret == 0, "test_sibling_conftest: py.test run for '%s', but '%s/conftest.py' loaded." % (dirname, other_dirname) + def test_directory_skipped(self, testdir): + testdir.makeconftest(""" + import py + def pytest_ignore_collect(): + py.test.skip("intentional") + """) + testdir.makepyfile("def test_hello(): pass") + result = testdir.runpytest() + assert result.ret == 0 + result.stdout.fnmatch_lines([ + "*1 skipped*" + ]) def test_multiple_items_per_collector_byid(self, testdir): c = testdir.makeconftest(""" diff --git a/testing/test_conftesthandle.py b/testing/test_conftesthandle.py index b6a35902e..7b9c868bb 100644 --- a/testing/test_conftesthandle.py +++ b/testing/test_conftesthandle.py @@ -33,7 +33,7 @@ class TestConftestValueAccessGlobal: conftest = Conftest(onimport=l.append) conftest.setinitial([basedir.join("adir"), '--confcutdir=%s' % basedir]) - assert len(l) == 2 + assert len(l) == 1 assert conftest.rget("a") == 1 assert conftest.rget("b", basedir.join("adir", "b")) == 2 assert len(l) == 2 @@ -170,7 +170,7 @@ def test_setinitial_conftest_subdirs(testdir, name): subconftest = sub.ensure("conftest.py") conftest = Conftest() conftest.setinitial([sub.dirpath(), '--confcutdir=%s' % testdir.tmpdir]) - if name != ".dotdir": + if name not in ('whatever', '.dotdir'): assert subconftest in conftest._conftestpath2mod assert len(conftest._conftestpath2mod) == 1 else: