Source code for envisage.tests.test_plugin_manager

# (C) Copyright 2007-2023 Enthought, Inc., Austin, TX
# All rights reserved.
#
# This software is provided without warranty under the terms of the BSD
# license included in LICENSE.txt and may be redistributed only under
# the conditions described in the aforementioned license. The license
# is also available online at http://www.enthought.com/licenses/BSD.txt
#
# Thanks for using Enthought open source!
""" Tests for the plugin manager. """


# Standard library imports.
import unittest

from traits.api import Bool

# Enthought library imports.
from envisage.api import Plugin, PluginManager


[docs]class SimplePlugin(Plugin): """A simple plugin.""" #### 'SimplePlugin' interface ############################################# started = Bool(False) stopped = Bool(False) ########################################################################### # 'IPlugin' interface. ###########################################################################
[docs] def start(self): """Start the plugin.""" self.started = True self.stopped = False
[docs] def stop(self): """Stop the plugin.""" self.started = False self.stopped = True
[docs]class BadPlugin(Plugin): """A plugin that just causes trouble ;^).""" ########################################################################### # 'IPlugin' interface. ###########################################################################
[docs] def start(self): """Start the plugin.""" raise 1 / 0
[docs] def stop(self): """Stop the plugin.""" raise 1 / 0
[docs]class PluginManagerTestCase(unittest.TestCase): """Tests for the plugin manager."""
[docs] def test_get_plugin(self): """get plugin""" simple_plugin = SimplePlugin() plugin_manager = PluginManager(plugins=[simple_plugin]) # Get the plugin. plugin = plugin_manager.get_plugin(simple_plugin.id) self.assertEqual(plugin, simple_plugin) # Try to get a non-existent plugin. self.assertEqual(None, plugin_manager.get_plugin("bogus"))
[docs] def test_iteration_over_plugins(self): """iteration over plugins""" simple_plugin = SimplePlugin() bad_plugin = BadPlugin() plugin_manager = PluginManager(plugins=[simple_plugin, bad_plugin]) # Iterate over the plugin manager's plugins. plugins = [] for plugin in plugin_manager: plugins.append(plugin) self.assertEqual([simple_plugin, bad_plugin], plugins)
[docs] def test_start_and_stop(self): """start and stop""" simple_plugin = SimplePlugin() plugin_manager = PluginManager(plugins=[simple_plugin]) # Start the plugin manager. This starts all of the plugin manager's # plugins. plugin_manager.start() # Make sure the plugin was started. self.assertEqual(True, simple_plugin.started) # Stop the plugin manager. This stops all of the plugin manager's # plugins. plugin_manager.stop() # Make sure the plugin was stopped. self.assertEqual(True, simple_plugin.stopped)
[docs] def test_start_and_stop_errors(self): """start and stop errors""" simple_plugin = SimplePlugin() bad_plugin = BadPlugin() plugin_manager = PluginManager(plugins=[simple_plugin, bad_plugin]) # Start the plugin manager. This starts all of the plugin manager's # plugins. with self.assertRaises(ZeroDivisionError): plugin_manager.start() # Stop the plugin manager. This stops all of the plugin manager's # plugins. with self.assertRaises(ZeroDivisionError): plugin_manager.stop() # Try to start a non-existent plugin. with self.assertRaises(ValueError): plugin_manager.start_plugin(plugin_id="bogus") # Try to stop a non-existent plugin. with self.assertRaises(ValueError): plugin_manager.stop_plugin(plugin_id="bogus")
[docs] def test_only_include_plugins_whose_ids_are_in_the_include_list(self): # Note that the items in the list use the 'fnmatch' syntax for matching # plugins Ids. include = ["foo", "bar"] with self.assertWarns(DeprecationWarning): plugin_manager = PluginManager( include=include, plugins=[ SimplePlugin(id="foo"), SimplePlugin(id="bar"), SimplePlugin(id="baz"), ], ) # The Ids of the plugins that we expect the plugin manager to find. expected = ["foo", "bar"] # Make sure the plugin manager found only the required plugins and that # it starts and stops them correctly.. self._test_start_and_stop(plugin_manager, expected)
[docs] def test_only_include_plugins_matching_a_wildcard_in_the_include_list( self, ): # Note that the items in the list use the 'fnmatch' syntax for matching # plugins Ids. include = ["b*"] with self.assertWarns(DeprecationWarning): plugin_manager = PluginManager( include=include, plugins=[ SimplePlugin(id="foo"), SimplePlugin(id="bar"), SimplePlugin(id="baz"), ], ) # The Ids of the plugins that we expect the plugin manager to find. expected = ["bar", "baz"] # Make sure the plugin manager found only the required plugins and that # it starts and stops them correctly.. self._test_start_and_stop(plugin_manager, expected)
[docs] def test_ignore_plugins_whose_ids_are_in_the_exclude_list(self): # Note that the items in the list use the 'fnmatch' syntax for matching # plugins Ids. exclude = ["foo", "baz"] with self.assertWarns(DeprecationWarning): plugin_manager = PluginManager( exclude=exclude, plugins=[ SimplePlugin(id="foo"), SimplePlugin(id="bar"), SimplePlugin(id="baz"), ], ) # The Ids of the plugins that we expect the plugin manager to find. expected = ["bar"] # Make sure the plugin manager found only the required plugins and that # it starts and stops them correctly.. self._test_start_and_stop(plugin_manager, expected)
[docs] def test_ignore_plugins_matching_a_wildcard_in_the_exclude_list(self): # Note that the items in the list use the 'fnmatch' syntax for matching # plugins Ids. exclude = ["b*"] with self.assertWarns(DeprecationWarning): plugin_manager = PluginManager( exclude=exclude, plugins=[ SimplePlugin(id="foo"), SimplePlugin(id="bar"), SimplePlugin(id="baz"), ], ) # The Ids of the plugins that we expect the plugin manager to find. expected = ["foo"] # Make sure the plugin manager found only the required plugins and that # it starts and stops them correctly.. self._test_start_and_stop(plugin_manager, expected)
#### Private protocol ##################################################### def _test_start_and_stop(self, plugin_manager, expected): """ Make sure the plugin manager starts and stops the expected plugins. """ # Make sure the plugin manager found only the required plugins. self.assertEqual(expected, [plugin.id for plugin in plugin_manager]) # Start the plugin manager. This starts all of the plugin manager's # plugins. plugin_manager.start() # Make sure all of the the plugins were started. for id in expected: plugin = plugin_manager.get_plugin(id) self.assertNotEqual(None, plugin) self.assertEqual(True, plugin.started) # Stop the plugin manager. This stops all of the plugin manager's # plugins. plugin_manager.stop() # Make sure all of the the plugins were stopped. for id in expected: plugin = plugin_manager.get_plugin(id) self.assertNotEqual(None, plugin) self.assertEqual(True, plugin.stopped)