From 2cdb54225c91393cc76870d875960c18ed3ee190 Mon Sep 17 00:00:00 2001 From: Floris Bruynooghe Date: Thu, 1 Aug 2013 18:58:28 +0100 Subject: [PATCH 1/2] Fix issue 336: autouse fixtures in plugins work again When an autouse fixture in a plugin was encountered None was stored as nodeid where it used to be ''. This broke the lookup of autouse fixtures later on. This also adds another test for the normal fixture ordering which was slightly wrong: a fixture without location was always added at the front of the fixture list rather then at the end of the fixtures without location but before the fixtures with location. --- _pytest/python.py | 12 +++++----- testing/python/fixture.py | 48 ++++++++++++++++++++++++++++++++++++++- 2 files changed, 53 insertions(+), 7 deletions(-) diff --git a/_pytest/python.py b/_pytest/python.py index 8ce12efb3..5b4f0b62c 100644 --- a/_pytest/python.py +++ b/_pytest/python.py @@ -1626,18 +1626,18 @@ class FixtureManager: unittest=unittest) faclist = self._arg2fixturedefs.setdefault(name, []) if not fixturedef.has_location: - # All Nones are at the front so this inserts the - # current fixturedef after the existing fixturedefs - # from external plugins but before the fixturedefs - # provided in conftests. - i = faclist.count(None) + # All fixturedefs with no location are at the front + # so this inserts the current fixturedef after the + # existing fixturedefs from external plugins but + # before the fixturedefs provided in conftests. + i = len([f for f in faclist if not f.has_location]) else: i = len(faclist) # append faclist.insert(i, fixturedef) if marker.autouse: autousenames.append(name) if autousenames: - self._nodeid_and_autousenames.append((nodeid, autousenames)) + self._nodeid_and_autousenames.append((nodeid or '', autousenames)) def getfixturedefs(self, argname, nodeid): try: diff --git a/testing/python/fixture.py b/testing/python/fixture.py index 6798da0a9..803e7ac45 100644 --- a/testing/python/fixture.py +++ b/testing/python/fixture.py @@ -173,7 +173,7 @@ class TestFillFixtures: result = testdir.runpytest(testfile) result.stdout.fnmatch_lines(["*1 passed*"]) - def test_extend_fixture_conftest_plugin(request, testdir): + def test_extend_fixture_conftest_plugin(self, testdir): testdir.makepyfile(testplugin=""" import pytest @@ -198,6 +198,52 @@ class TestFillFixtures: result = testdir.runpytest('-s') assert result.ret == 0 + def test_extend_fixture_plugin_plugin(self, testdir): + # Two plugins should extend each order in loading order + testdir.makepyfile(testplugin0=""" + import pytest + + @pytest.fixture + def foo(): + return 7 + """) + testdir.makepyfile(testplugin1=""" + import pytest + + @pytest.fixture + def foo(foo): + return foo + 7 + """) + testdir.syspathinsert() + testdir.makepyfile(""" + pytest_plugins = ['testplugin0', 'testplugin1'] + + def test_foo(foo): + assert foo == 14 + """) + result = testdir.runpytest() + assert result.ret == 0 + + def test_autouse_fixture_plugin(self, testdir): + # A fixture from a plugin has no baseid set, which screwed up + # the autouse fixture handling. + testdir.makepyfile(testplugin=""" + import pytest + + @pytest.fixture(autouse=True) + def foo(request): + request.function.foo = 7 + """) + testdir.syspathinsert() + testdir.makepyfile(""" + pytest_plugins = 'testplugin' + + def test_foo(request): + assert request.function.foo == 7 + """) + result = testdir.runpytest() + assert result.ret == 0 + def test_funcarg_lookup_error(self, testdir): p = testdir.makepyfile(""" def test_lookup_error(unknown): From cfe1d4f7c9daa4cfdfb539d178878c1735bcfa5d Mon Sep 17 00:00:00 2001 From: Floris Bruynooghe Date: Thu, 1 Aug 2013 19:03:53 +0100 Subject: [PATCH 2/2] mention fix for issue 336 in changelog --- CHANGELOG | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG b/CHANGELOG index 563cb93f2..938a6297e 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,6 +1,8 @@ Changes between 2.3.5 and 2.4.DEV ----------------------------------- +- fix issue336: autouse fixture in plugins should work again. + - change to use hyphen-separated long options but keep the old spelling backward compatible. py.test -h will only show the hyphenated version, for example "--collect-only" but "--collectonly" will remain valid as well