Source code for envisage.tests.test_core_plugin
# (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 core plugin. """
# Standard library imports.
import unittest
# Major package imports.
from pkg_resources import resource_filename
from traits.api import HasTraits, Interface, List, on_trait_change, Str
# Enthought library imports.
from envisage.api import CorePlugin, Plugin, ServiceOffer
from envisage.tests.support import SimpleApplication
# This module's package.
PKG = "envisage.tests"
[docs]class CorePluginTestCase(unittest.TestCase):
"""Tests for the core plugin."""
[docs] def test_service_offers(self):
"""service offers"""
class IMyService(Interface):
pass
class PluginA(Plugin):
id = "A"
service_offers = List(contributes_to="envisage.service_offers")
def _service_offers_default(self):
"""Trait initializer."""
service_offers = [
ServiceOffer(
protocol=IMyService, factory=self._my_service_factory
)
]
return service_offers
def _my_service_factory(self, **properties):
"""Service factory."""
return 42
core = CorePlugin()
a = PluginA()
application = SimpleApplication(plugins=[core, a])
application.start()
# Lookup the service.
self.assertEqual(42, application.get_service(IMyService))
# Stop the core plugin.
application.stop_plugin(core)
# Make sure th service has gone.
self.assertEqual(None, application.get_service(IMyService))
[docs] def test_dynamically_added_service_offer(self):
"""dynamically added service offer"""
class IMyService(Interface):
pass
class PluginA(Plugin):
id = "A"
service_offers = List(contributes_to="envisage.service_offers")
def _service_offers_default(self):
"""Trait initializer."""
service_offers = [
ServiceOffer(
protocol=IMyService, factory=self._my_service_factory
)
]
return service_offers
def _my_service_factory(self, **properties):
"""Service factory."""
return 42
core = CorePlugin()
a = PluginA()
# Start off with just the core plugin.
application = SimpleApplication(plugins=[core])
application.start()
# Make sure the service does not exist!
service = application.get_service(IMyService)
self.assertIsNone(service)
# Make sure the service offer exists...
extensions = application.get_extensions("envisage.service_offers")
self.assertEqual(0, len(extensions))
# Now add a plugin that contains a service offer.
application.add_plugin(a)
# Make sure the service offer exists...
extensions = application.get_extensions("envisage.service_offers")
self.assertEqual(1, len(extensions))
# ... and that the core plugin responded to the new service offer and
# published it in the service registry.
service = application.get_service(IMyService)
self.assertEqual(42, service)
[docs] def test_preferences(self):
"""preferences"""
class PluginA(Plugin):
id = "A"
preferences = List(contributes_to="envisage.preferences")
def _preferences_default(self):
"""Trait initializer."""
return ["file://" + resource_filename(PKG, "preferences.ini")]
core = CorePlugin()
a = PluginA()
application = SimpleApplication(plugins=[core, a])
application.run()
# Make sure we can get one of the preferences.
self.assertEqual("42", application.preferences.get("enthought.test.x"))
[docs] def test_dynamically_added_preferences(self):
"""dynamically added preferences"""
class PluginA(Plugin):
id = "A"
preferences = List(contributes_to="envisage.preferences")
def _preferences_default(self):
"""Trait initializer."""
return ["file://" + resource_filename(PKG, "preferences.ini")]
core = CorePlugin()
a = PluginA()
# Start with just the core plugin.
application = SimpleApplication(plugins=[core])
application.start()
# Now add a plugin that contains a preference.
application.add_plugin(a)
# Make sure we can get one of the preferences.
self.assertEqual("42", application.preferences.get("enthought.test.x"))
# regression test for enthought/envisage#251
[docs] def test_unregister_service_offer(self):
"""Unregister a service that is contributed to the
"envisage.service_offers" extension point while the application is
running.
"""
class IJunk(Interface):
trash = Str()
class Junk(HasTraits):
trash = Str("garbage")
class PluginA(Plugin):
# The Ids of the extension points that this plugin contributes to.
SERVICE_OFFERS = "envisage.service_offers"
service_offers = List(contributes_to=SERVICE_OFFERS)
def _service_offers_default(self):
a_service_offer = ServiceOffer(
protocol=IJunk,
factory=self._create_junk_service,
)
return [a_service_offer]
def _create_junk_service(self):
"""Factory method for the 'Junk' service."""
return Junk()
@on_trait_change("application:started")
def _unregister_junk_service(self):
# only 1 service is registered so it has service_id of 1
self.application.unregister_service(1)
application = SimpleApplication(
plugins=[CorePlugin(), PluginA()],
)
# Run it!
application.run()
[docs] def test_unregister_service(self):
"""Unregister a service which was registered on the application
directly, not through the CorePlugin's extension point. CorePlugin
should not do anything to interfere."""
class IJunk(Interface):
trash = Str()
class Junk(HasTraits):
trash = Str("garbage")
some_junk = Junk()
application = SimpleApplication(
plugins=[CorePlugin()],
)
application.start()
some_junk_id = application.register_service(IJunk, some_junk)
application.unregister_service(some_junk_id)
application.stop()