From 1a153487c3cb83550f6d80feb34c5c972f6ad6c2 Mon Sep 17 00:00:00 2001 From: Lance Stout Date: Sun, 11 Mar 2012 18:30:15 -0700 Subject: [PATCH] Add tests for new plugin manager. --- tests/test_plugins.py | 162 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 162 insertions(+) create mode 100644 tests/test_plugins.py diff --git a/tests/test_plugins.py b/tests/test_plugins.py new file mode 100644 index 00000000..6220d7a5 --- /dev/null +++ b/tests/test_plugins.py @@ -0,0 +1,162 @@ +import unittest +import logging + +from sleekxmpp.plugins.base import PluginManager, BasePlugin, register_plugin + + +class A(BasePlugin): + name = 'a' + + +class B(BasePlugin): + name = 'b' + + +class C(BasePlugin): + name = 'c' + dependencies = set(['b', 'd']) + + +class D(BasePlugin): + name = 'd' + dependencies = set(['c']) + + +class E(BasePlugin): + name = 'e' + dependencies = set(['a', 'd']) + +class F(BasePlugin): + name = 'f' + dependencies = set(['a', 'b']) + + +register_plugin(A) +register_plugin(B) +register_plugin(C) +register_plugin(D) +register_plugin(E) +register_plugin(F) + + +class TestPlugins(unittest.TestCase): + + + def test_enable(self): + """Enable a single plugin.""" + p = PluginManager(None) + + events = [] + + def init(self): + events.append('init') + + A.plugin_init = init + + p.enable('a') + + self.assertEqual(len(p), 1, "Wrong number of enabled plugins.") + self.assertEqual(events, ['init'], "Plugin init method not called.") + + def test_disable(self): + """Disable a single plugin.""" + p = PluginManager(None) + + events = [] + + def init(self): + events.append('init') + + def end(self): + events.append('end') + + A.plugin_init = init + A.plugin_end = end + + p.enable('a') + p.disable('a') + + self.assertEqual(len(p), 0, "Wrong number of enabled plugins.") + self.assertEqual(events, ['init', 'end'], + "Plugin lifecycle methods not called.") + + def test_enable_dependencies(self): + """Enable a plugin with acyclic dependencies.""" + p = PluginManager(None) + + events = [] + + A.plugin_init = lambda s: events.append('init_a') + B.plugin_init = lambda s: events.append('init_b') + + p.enable('f') + + self.assertEqual(len(p), 3, "Wrong number of enabled plugins.") + self.assertTrue('init_a' in events, "Dependency A not enabled.") + self.assertTrue('init_b' in events, "Dependency B not enabled.") + + def test_enable_cyclic_dependencies(self): + """Enable a plugin with cyclic dependencies.""" + + p = PluginManager(None) + + events = [] + + B.plugin_init = lambda s: events.append('init_b') + C.plugin_init = lambda s: events.append('init_c') + D.plugin_init = lambda s: events.append('init_d') + + p.enable('c') + + self.assertEqual(len(p), 3, "Wrong number of enabled plugins.") + self.assertTrue('init_b' in events, "Dependency B not enabled.") + self.assertTrue('init_c' in events, "Dependency C not enabled.") + self.assertTrue('init_d' in events, "Dependency D not enabled.") + + def test_disable_dependendents(self): + """Disable a plugin with dependents.""" + + p = PluginManager(None) + + events = [] + + A.plugin_end = lambda s: events.append('end_a') + B.plugin_end = lambda s: events.append('end_b') + F.plugin_end = lambda s: events.append('end_f') + + p.enable('f') + p.disable('a') + + self.assertEqual(len(p), 1, "Wrong number of enabled plugins.") + self.assertTrue('end_f' in events, "Dependent F not disabled.") + self.assertTrue('end_a' in events, "Plugin A not disabled.") + + def test_disable_cyclic_dependents(self): + """Disable a plugin with cyclic dependents.""" + + p = PluginManager(None) + + events = [] + + B.plugin_end = lambda s: events.append('end_b') + C.plugin_end = lambda s: events.append('end_c') + D.plugin_end = lambda s: events.append('end_d') + + p.enable('c') + p.disable('b') + + self.assertEqual(len(p), 0, "Wrong number of enabled plugins.") + self.assertTrue('end_b' in events, "Plugin B not disabled.") + self.assertTrue('end_c' in events, "Dependent C not disabled.") + self.assertTrue('end_d' in events, "Dependent D not disabled.") + + + +suite = unittest.TestLoader().loadTestsFromTestCase(TestPlugins) + +if __name__ == '__main__': + logging.basicConfig(level=logging.DEBUG, + format='%(levelname)-8s %(message)s') + + tests = unittest.TestSuite([suite]) + unittest.TextTestRunner(verbosity=2).run(tests)