diff --git a/force_bdss/ui_hooks/base_ui_hooks_factory.py b/force_bdss/ui_hooks/base_ui_hooks_factory.py index 111a8588943da107d75c8591971967de83be8c50..b9bc960c53a109b7a8314b02a3220d23b15bd035 100644 --- a/force_bdss/ui_hooks/base_ui_hooks_factory.py +++ b/force_bdss/ui_hooks/base_ui_hooks_factory.py @@ -1,5 +1,5 @@ import logging -from traits.api import ABCHasStrictTraits, Instance, String, provides, Type +from traits.api import ABCHasStrictTraits, Instance, Str, provides, Type from envisage.plugin import Plugin from force_bdss.ids import factory_id @@ -16,14 +16,14 @@ class BaseUIHooksFactory(ABCHasStrictTraits): moments of the UI lifetime. """ #: identifier of the factory - id = String() + id = Str() #: Name of the factory. User friendly for UI - name = String() + name = Str() #: The UI Hooks manager class to instantiate. Define this to your #: base hook managers. - ui_hooks_manager_class = Type(BaseUIHooksManager) + ui_hooks_manager_class = Type(BaseUIHooksManager, allow_none=False) #: A reference to the containing plugin plugin = Instance(Plugin) @@ -42,7 +42,17 @@ class BaseUIHooksFactory(ABCHasStrictTraits): self.ui_hooks_manager_class = self.get_ui_hooks_manager_class() self.name = self.get_name() identifier = self.get_identifier() - self.id = factory_id(self.plugin.id, identifier) + try: + id = factory_id(self.plugin.id, identifier) + except ValueError: + raise ValueError( + "Invalid identifier {} returned by " + "{}.get_identifier()".format( + identifier, + self.__class__.__name__ + ) + ) + self.id = id def get_ui_hooks_manager_class(self): raise NotImplementedError( diff --git a/force_bdss/ui_hooks/tests/test_base_ui_hooks_factory.py b/force_bdss/ui_hooks/tests/test_base_ui_hooks_factory.py index dd65ce867496dcb8a2b9f5a06a5a14221f56150e..9ee721d6c00c96389b9c44b9c5922393e12c2ed0 100644 --- a/force_bdss/ui_hooks/tests/test_base_ui_hooks_factory.py +++ b/force_bdss/ui_hooks/tests/test_base_ui_hooks_factory.py @@ -1,7 +1,8 @@ import unittest -import testfixtures +from traits.trait_errors import TraitError +from force_bdss.ui_hooks.base_ui_hooks_factory import BaseUIHooksFactory from force_bdss.ui_hooks.tests.test_base_ui_hooks_manager import \ DummyUIHooksManager @@ -11,37 +12,52 @@ except ImportError: from unittest import mock from envisage.api import Plugin -from ..base_ui_hooks_factory import BaseUIHooksFactory class DummyUIHooksFactory(BaseUIHooksFactory): - def create_ui_hooks_manager(self): - return DummyUIHooksManager(self) + def get_identifier(self): + return "foo" + def get_name(self): + return "bar" -class DummyUIHooksFactoryFast(BaseUIHooksFactory): - ui_hooks_manager_class = DummyUIHooksManager + def get_ui_hooks_manager_class(self): + return DummyUIHooksManager class TestBaseUIHooksFactory(unittest.TestCase): + def setUp(self): + self.plugin = mock.Mock(spec=Plugin, id="pid") + def test_initialize(self): - mock_plugin = mock.Mock(spec=Plugin) - factory = DummyUIHooksFactory(plugin=mock_plugin) - self.assertEqual(factory.plugin, mock_plugin) - - def test_fast_definition(self): - mock_plugin = mock.Mock(spec=Plugin) - factory = DummyUIHooksFactoryFast(plugin=mock_plugin) - - self.assertIsInstance( - factory.create_ui_hooks_manager(), - DummyUIHooksManager) - - def test_fast_definition_errors(self): - mock_plugin = mock.Mock(spec=Plugin) - factory = DummyUIHooksFactoryFast(plugin=mock_plugin) - factory.ui_hooks_manager_class = None - - with testfixtures.LogCapture(): - with self.assertRaises(RuntimeError): - factory.create_ui_hooks_manager() + factory = DummyUIHooksFactory(plugin=self.plugin) + self.assertEqual(factory.plugin, self.plugin) + self.assertEqual(factory.id, "pid.factory.foo") + self.assertEqual(factory.name, "bar") + self.assertEqual(factory.ui_hooks_manager_class, DummyUIHooksManager) + self.assertIsInstance(factory.create_ui_hooks_manager(), + DummyUIHooksManager) + + def test_broken_get_identifier(self): + class Broken(DummyUIHooksFactory): + def get_identifier(self): + return None + + with self.assertRaises(ValueError): + Broken(self.plugin) + + def test_broken_get_name(self): + class Broken(DummyUIHooksFactory): + def get_name(self): + return None + + with self.assertRaises(TraitError): + Broken(self.plugin) + + def test_broken_get_ui_hooks_manager_class(self): + class Broken(DummyUIHooksFactory): + def get_ui_hooks_manager_class(self): + return None + + with self.assertRaises(TraitError): + Broken(self.plugin) diff --git a/force_bdss/ui_hooks/tests/test_base_ui_hooks_manager.py b/force_bdss/ui_hooks/tests/test_base_ui_hooks_manager.py index 5e3afd44a95908f9738867c9545c6b38e0be4a43..f1b53dcd2d7a56260fd60bf0dbc4141861fb1324 100644 --- a/force_bdss/ui_hooks/tests/test_base_ui_hooks_manager.py +++ b/force_bdss/ui_hooks/tests/test_base_ui_hooks_manager.py @@ -1,7 +1,8 @@ import unittest -from ..base_ui_hooks_manager import BaseUIHooksManager -from ..base_ui_hooks_factory import BaseUIHooksFactory +from force_bdss.ui_hooks.base_ui_hooks_factory import BaseUIHooksFactory +from force_bdss.ui_hooks.base_ui_hooks_manager import BaseUIHooksManager + try: import mock except ImportError: