Source code for envisage.tests.test_composite_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 composite plugin manager. """
import unittest
from traits.api import Bool
from envisage.application import Application
from envisage.composite_plugin_manager import CompositePluginManager
from envisage.plugin import Plugin
from envisage.plugin_manager import PluginManager
[docs]class SimplePlugin(Plugin):
"""A simple plugin."""
#### 'SimplePlugin' protocol ##############################################
started = Bool(False)
stopped = Bool(False)
#### 'IPlugin' protocol ###################################################
[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 CustomException(Exception):
"""Custom exception used for testing purposes."""
pass
[docs]class RaisingPluginManager(PluginManager):
"""A PluginManager that raises on iteration."""
def __iter__(self):
raise CustomException("Something went wrong.")
[docs]class CompositePluginManagerTestCase(unittest.TestCase):
"""Tests for the composite plugin manager."""
[docs] def test_find_no_plugins_if_there_are_no_plugin_managers(self):
plugin_manager = CompositePluginManager()
ids = [plugin.id for plugin in plugin_manager]
self.assertEqual(0, len(ids))
[docs] def test_find_no_plugins_if_there_are_no_plugins_in_plugin_managers(self):
plugin_manager = CompositePluginManager(
plugin_managers=[PluginManager(), PluginManager()]
)
ids = [plugin.id for plugin in plugin_manager]
self.assertEqual(0, len(ids))
[docs] def test_find_plugins_in_a_single_plugin_manager(self):
plugin_manager = CompositePluginManager(
plugin_managers=[
PluginManager(
plugins=[SimplePlugin(id="red"), SimplePlugin(id="yellow")]
)
]
)
ids = [plugin.id for plugin in plugin_manager]
self.assertEqual(2, len(ids))
self.assertIn("red", ids)
self.assertIn("yellow", ids)
self._test_start_and_stop(plugin_manager, ["red", "yellow"])
[docs] def test_find_plugins_in_a_multiple_plugin_managers(self):
plugin_manager = CompositePluginManager(
plugin_managers=[
PluginManager(
plugins=[SimplePlugin(id="red"), SimplePlugin(id="yellow")]
),
PluginManager(plugins=[SimplePlugin(id="green")]),
]
)
ids = [plugin.id for plugin in plugin_manager]
self.assertEqual(3, len(ids))
self.assertIn("red", ids)
self.assertIn("yellow", ids)
self.assertIn("green", ids)
self._test_start_and_stop(plugin_manager, ["red", "yellow", "green"])
[docs] def test_application_gets_propogated_to_plugin_managers(self):
application = Application()
composite_plugin_manager = CompositePluginManager(
application=application,
plugin_managers=[PluginManager(), PluginManager()],
)
for plugin_manager in composite_plugin_manager.plugin_managers:
self.assertEqual(application, plugin_manager.application)
[docs] def test_propogate_plugin_added_or_remove_events_from_plugin_managers(
self,
):
a = PluginManager()
b = PluginManager()
composite_plugin_manager = CompositePluginManager(
plugin_managers=[a, b]
)
composite_plugin_manager._plugins
def added(obj, trait_name, old, new):
added.count += 1
added.count = 0
composite_plugin_manager.on_trait_change(added, "plugin_added")
def removed(obj, trait_name, old, new):
removed.count += 1
removed.count = 0
composite_plugin_manager.on_trait_change(removed, "plugin_removed")
a.add_plugin(Plugin(id="foo"))
self.assertEqual(1, self._plugin_count(composite_plugin_manager))
a.remove_plugin(a.get_plugin("foo"))
self.assertEqual(0, self._plugin_count(composite_plugin_manager))
[docs] def test_correct_exception_propagated_from_plugin_manager(self):
plugin_manager = CompositePluginManager(
plugin_managers=[RaisingPluginManager()]
)
with self.assertRaises(CustomException):
plugin_manager.start()
#### Private protocol #####################################################
def _plugin_count(self, plugin_manager):
"""Return how many plugins the plugin manager contains."""
count = 0
for plugin in plugin_manager:
count += 1
return count
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)