[py-svn] r62101 - in py/branch/pytestplugin/py/test: . plugin testing

hpk at codespeak.net hpk at codespeak.net
Mon Feb 23 20:10:10 CET 2009


Author: hpk
Date: Mon Feb 23 20:10:09 2009
New Revision: 62101

Modified:
   py/branch/pytestplugin/py/test/plugin/pytest_pytester.py
   py/branch/pytestplugin/py/test/pytestplugin.py
   py/branch/pytestplugin/py/test/testing/test_pytestplugin.py
Log:
sorting through plugin tests, marking some and writing a new one marked with xfail


Modified: py/branch/pytestplugin/py/test/plugin/pytest_pytester.py
==============================================================================
--- py/branch/pytestplugin/py/test/plugin/pytest_pytester.py	(original)
+++ py/branch/pytestplugin/py/test/plugin/pytest_pytester.py	Mon Feb 23 20:10:09 2009
@@ -22,6 +22,13 @@
         name = name.replace(".", "_")
         self.tmpdir = py.test.ensuretemp(name)
         self._plugins = []
+        self._syspathremove = []
+        #self._olddir = py.std.os.getcwd()
+
+    def finalize(self):
+        for p in self._syspathremove:
+            py.std.sys.path.remove(p)
+        #py.std.os.chdir(self._olddir)
 
     def _makefile(self, ext, args, kwargs):
         items = kwargs.items()
@@ -47,6 +54,12 @@
     def maketxtfile(self, *args, **kwargs):
         return self._makefile('.txt', args, kwargs)
 
+    def syspathinsert(self, path=None):
+        if path is None:
+            path = self.tmpdir
+        py.std.sys.path.insert(0, str(path))
+        self._syspathremove.append(str(path))
+            
     def mkdir(self, name):
         return self.tmpdir.mkdir(name)
     
@@ -378,7 +391,9 @@
         return LineMatcher
 
     def pytest_pyfuncarg_testdir(self, pyfuncitem):
-        return TmpTestdir(pyfuncitem)
-    
+        tmptestdir = TmpTestdir(pyfuncitem)
+        pyfuncitem.addfinalizer(tmptestdir.finalize)
+        return tmptestdir
+ 
     def pytest_pyfuncarg_EventRecorder(self, pyfuncitem):
         return EventRecorder

Modified: py/branch/pytestplugin/py/test/pytestplugin.py
==============================================================================
--- py/branch/pytestplugin/py/test/pytestplugin.py	(original)
+++ py/branch/pytestplugin/py/test/pytestplugin.py	Mon Feb 23 20:10:09 2009
@@ -29,6 +29,7 @@
         return self._plugins[pname.lower()] 
     
     def setinitial(self, modules):
+        self.pyplugins.consider_env("PYTEST_PLUGINS")
         for module in modules:
             self.consider_module(module)
 
@@ -43,20 +44,24 @@
     def import_plugin(self, spec):
         assert isinstance(spec, str)
         modname, clsname = canonical_names(spec)
-        if clsname.lower() not in self._plugins:
-            mod = importplugin(modname)
-            plugin = registerplugin(self.pyplugins.register, mod, clsname)
-            self._plugins[clsname.lower()] = plugin
-            self.consider_module(mod)
+        if clsname.lower() in self._plugins:
+            return
+        mod = importplugin(modname)
+        plugin = registerplugin(self.pyplugins.register, mod, clsname)
+        self._plugins[clsname.lower()] = plugin
+        self.consider_module(mod)
     # 
     #
     # API for interacting with registered and instantiated plugin objects 
     #
     # 
-    def getfirst(self, methname):
-        for x in self.pyplugins.listattr(methname):
+    def getfirst(self, attrname):
+        for x in self.pyplugins.listattr(attrname):
             return x
-        
+
+    def listattr(self, attrname):
+        return self.pyplugins.listattr(attrname)
+
     def call_firstresult(self, *args, **kwargs):
         return self.pyplugins.call_firstresult(*args, **kwargs)
 

Modified: py/branch/pytestplugin/py/test/testing/test_pytestplugin.py
==============================================================================
--- py/branch/pytestplugin/py/test/testing/test_pytestplugin.py	(original)
+++ py/branch/pytestplugin/py/test/testing/test_pytestplugin.py	Mon Feb 23 20:10:09 2009
@@ -1,7 +1,6 @@
 import py
 from py.__.test.pytestplugin import PytestPlugins, canonical_names
 from py.__.test.pytestplugin import registerplugin, importplugin
-from py.__.test.config import Config as pytestConfig
 
 def test_considermodule():
     pp = PytestPlugins()
@@ -16,8 +15,8 @@
     py.test.raises(ImportError, "pp.setinitial([mod])")
     
 class TestPytestPlugins:
-    def test_configure(self):
-        config = pytestConfig()
+    def test_configure(self, testdir):
+        config = testdir.parseconfig()
         l = []
         events = []
         class A:
@@ -117,129 +116,75 @@
 from py.__.test.config import Config as pytestConfig
 
 class TestInitialization:
-    disabled = True
-    def setup_method(self, method):
-        self.tmpdir = py.test.ensuretemp("%s.%s.%s" %
-            (__name__, self.__class__.__name__, method.__name__))
-
-    def test_import_plugin_importname(self):
+    def test_setinitial_env(self):
         plugins = PytestPlugins()
-        py.test.raises(ImportError, 'plugins.import_plugin("x.y")')
-        py.test.raises(ImportError, 'plugins.import_plugin("pytest_x.y")')
-
-        sys.path.insert(0, str(self.tmpdir))
-        try:
-            pluginname = "pytest_hello"
-            self.tmpdir.join(pluginname + ".py").write(py.code.Source("""
-                class Hello:
-                    pass
-            """))
-            plugins.import_plugin("hello")
-            plugins.import_plugin("pytest_hello")
-            plugin = plugins.getplugin("hello")
-        finally:
-            sys.path.remove(str(self.tmpdir))
-
-    def test_import_plugin_defaults_to_pytestplugin(self):
-        from py.__.test.defaultconftest import pytest_plugins
-        for name in pytest_plugins:
-            if isinstance(name, str):
-                break
-        sys.path.insert(0, str(self.tmpdir))
+        KEY = "PYTEST_PLUGINS"
+        old = os.environ.get(KEY, None)
         try:
-            self.tmpdir.join(name + ".py").write(py.code.Source("""
-                class Terminal:
-                    pass
-                class AnotherPlugin:
-                    pass
-                pytest_plugins = AnotherPlugin
-            """))
-            plugins = PytestPlugins()
-            plugins.import_plugin(name) 
-            plugin = plugins.getplugin("terminal") 
-            #del sys.modules[name]
-            print plugins._plugins
-            plugin = plugins.getplugin("anotherplugin") 
+            os.environ[KEY] = "test_setinitial"
+            py.test.raises(ImportError, "plugins.setinitial([])")
         finally:
-            sys.path.remove(str(self.tmpdir))
-
-    def test_import_plugin_class(self):
-        plugins = PytestPlugins()
-        class SomePlugin:
-            pass
-        plugins.import_plugin(SomePlugin)
-        plugin = plugins.getplugin("someplugin") 
-        assert isinstance(plugin, SomePlugin)
-        i = len(plugins._plugins)
-        plugins.import_plugin(SomePlugin)
-        assert len(plugins._plugins) == i
-
-    def test_addpluginclass_post_configure(self):
-        plugins = PytestPlugins()
-        l = []
-        class SomePlugin:
-            def pytest_configure(self, config):
-                l.append(config)
-        conf = pytestConfig()
-        plugins.configure(config=conf)
-        plugins.import_plugin(SomePlugin)
-        assert len(l) == 1
-        assert l[0] is conf
+            if old is None: 
+                del os.environ[KEY]
+            else:
+                os.environ[KEY] = old 
 
-    def test_consider_module(self):
+    def test_import_plugin_importname(self, testdir):
         plugins = PytestPlugins()
-        sys.path.insert(0, str(self.tmpdir))
-        try:
-            self.tmpdir.join("pytest_plug1.py").write("class Plug1: pass")
-            self.tmpdir.join("pytest_plug2.py").write("class Plug2: pass")
-            mod = py.std.new.module("temp")
-            mod.pytest_plugins = ["pytest_plug1", "pytest_plug2"]
-            plugins.consider_module(mod)
-            assert plugins.getplugin("plug1").__class__.__name__ == "Plug1"
-            assert plugins.getplugin("plug2").__class__.__name__ == "Plug2"
-        finally:
-            sys.path.remove(str(self.tmpdir))
-
+        py.test.raises(ImportError, 'plugins.import_plugin("x.y")')
+        py.test.raises(ImportError, 'plugins.import_plugin("pytest_x.y")')
 
-    def test_addpluginclass(self):
-        plugins = PytestPlugins()
-        class My:
-            pass 
-        plugins.addpluginclass(My)
-        assert len(plugins._plugins) == 1
-        plugins.addpluginclass(My)
-        assert len(plugins._plugins) == 1
+        reset = testdir.syspathinsert()
+        pluginname = "pytest_hello"
+        testdir.makepyfile(**{pluginname: """
+            class Hello:
+                pass
+        """})
+        plugins.import_plugin("hello")
+        plugins.import_plugin("pytest_hello")
+        plugin = plugins.getplugin("hello")
+
+    def test_consider_module(self, testdir):
+        plugins = PytestPlugins()
+        testdir.syspathinsert()
+        testdir.makepyfile(pytest_plug1="class Plug1: pass")
+        testdir.makepyfile(pytest_plug2="class Plug2: pass")
+        mod = py.std.new.module("temp")
+        mod.pytest_plugins = ["pytest_plug1", "pytest_plug2"]
+        plugins.consider_module(mod)
+        assert plugins.getplugin("plug1").__class__.__name__ == "Plug1"
+        assert plugins.getplugin("plug2").__class__.__name__ == "Plug2"
 
+    @py.test.keywords(xfail="getplugin() naming is unclear unconcept")
     def test_getplugin(self):
         plugins = PytestPlugins()
         assert py.test.raises(LookupError, "plugins.getplugin('_xxx')")
 
         class PluGin: pass 
-        plugins.addpluginclass(PluGin)
+        plugins.register(PluGin())
         myplugin1 = plugins.getplugin("plugin")
         myplugin2 = plugins.getplugin("Plugin") 
         assert myplugin1 is myplugin2 
 
 class TestPluginInteraction:
-    disabled = True
     def test_getfirst(self):
         plugins = PytestPlugins()
         class My1:
             x = 1
         assert plugins.getfirst("x") is None
-        plugins.addpluginclass(My1)
+        plugins.register(My1())
         assert plugins.getfirst("x") == 1
 
-    def test_call_plugins(self):
+    def test_call_each(self):
         plugins = PytestPlugins()
         class My:
             def method(self, arg):
                 pass
-        plugins.addpluginclass(My)
-        py.test.raises(TypeError, 'plugins.call_plugins("method")')
-        py.test.raises(TypeError, 'plugins.call_plugins("method", 42)')
-        plugins.call_plugins("method", arg=42)
-        py.test.raises(TypeError, 'plugins.call_plugins("method", arg=42, s=13)')
+        plugins.register(My())
+        py.test.raises(TypeError, 'plugins.call_each("method")')
+        l = plugins.call_each("method", arg=42)
+        assert l == []
+        py.test.raises(TypeError, 'plugins.call_each("method", arg=42, s=13)')
 
     def test_call_firstresult(self):
         plugins = PytestPlugins()
@@ -254,90 +199,41 @@
                 return None
         assert plugins.call_firstresult("method") is None
         assert plugins.call_firstresult("methodnotexists") is None
-        plugins.addpluginclass(My1)
+        plugins.register(My1())
         assert plugins.call_firstresult("method") is None
-        plugins.addpluginclass(My2)
+        plugins.register(My2())
         assert plugins.call_firstresult("method") == True
-        plugins.addpluginclass(My3)
+        plugins.register(My3())
         assert plugins.call_firstresult("method") == True
 
     def test_listattr(self):
         plugins = PytestPlugins()
         class My2:
             x = 42
-        plugins.addpluginclass(My2)
+        plugins.register(My2())
         assert not plugins.listattr("hello")
-        assert plugins.listattr("x") == [('my2', 42)]
-
-    def test_eventbus_interaction(self):
-        plugins = PytestPlugins()
-        l = []
-        class My3:
-            def pytest_configure(self, config):
-                l.append("configure")
-            def pytest_unconfigure(self, config):
-                l.append("unconfigure")
-        plugins.addpluginclass(My3)
-        config = pytestConfig()
-        plugins.configure(config)
-        assert config.bus.issubscribed(plugins.forward_event)
-        plugins.unconfigure(config)
-        assert not config.bus.issubscribed(plugins.forward_event)
-        assert l == ['configure', 'unconfigure']
-
-    def test_pytest_event(self):
-        plugins = PytestPlugins()
-        l = []
-        class My2:
-            def pytest_event(self, event):
-                l.append(event) 
-        plugins.addpluginclass(My2)
-        ev = NOP()
-        plugins.forward_event(ev)
-        assert len(l) == 1
-        assert l[0] is ev
-
-    def test_addcmdlineoptions(self):
-        plugins = PytestPlugins()
-        class My:
-            pytest_cmdlineoptions = [
-                py.test.config.Option("--hello", dest="dest", default=242)
-            ]
-        plugins.addpluginclass(My)
-        config = pytestConfig()
-        plugins.add_cmdlineoptions(config)
-        opt = config._parser.get_option("--hello")
-        assert opt
-        assert opt.default == 242
+        assert plugins.listattr("x") == [42]
 
-    def test_setinitial_env(self):
-        plugins = PytestPlugins()
-        KEY = "PYTEST_PLUGINS"
-        old = os.environ.get(KEY, None)
-        try:
-            os.environ[KEY] = "test_setinitial"
-            py.test.raises(ImportError, "plugins.setinitial([])")
-        finally:
-            if old is None: 
-                del os.environ[KEY]
-            else:
-                os.environ[KEY] = old 
-
-    def test_conftest_specifies_plugin(self, testdir):
+    @py.test.keywords(xfail="implement setupcall")
+    def test_call_setup_participants(self, testdir):
         testdir.makepyfile(
             conftest="""
                 import py
-                class MyPlugin:
-                    pytest_cmdlineoptions = [
-                        py.test.config.Option("--myplugin-option", dest="myplugin", 
-                        help="myplugin option",
-                        )
-                    ]
-                pytest_plugins = MyPlugin
+                def pytest_method(self, x):
+                    return x+1
+                pytest_plugin = "pytest_someplugin",
             """
         )
-        result = testdir.runpytest(testdir.tmpdir, '-h')
-        result.stdout.fnmatch_lines([
-            "*--myplugin-option*", 
-        ])
-
+        testdir.makepyfile(pytest_someplugin="""
+                def pytest_method(self, x):
+                    return x+1
+        """)
+        modcol = testdir.getmodulecol("""
+            def pytest_method(x):
+                return x+0 
+        """)
+        l = []
+        call = modcol._config.pytestplugins.setupcall(modcol, "pytest_method", 1)
+        assert len(call.methods) == 3
+        results = call.execute()
+        assert results == [1,2,2]



More information about the pytest-commit mailing list