diff options
Diffstat (limited to 'tests/test_basics.py')
| -rw-r--r-- | tests/test_basics.py | 91 |
1 files changed, 91 insertions, 0 deletions
diff --git a/tests/test_basics.py b/tests/test_basics.py new file mode 100644 index 0000000..3130d49 --- /dev/null +++ b/tests/test_basics.py @@ -0,0 +1,91 @@ +import sys + +from pluginbase import get_plugin_source + + +def test_basic_plugin(source, dummy_internal_name): + # When the source is active the import gives us a module + with source: + from dummy.plugins import hello + + # Which because of a stable identifier has a predictable name. + assert hello.__name__ == dummy_internal_name + '.hello' + + # And can continue to import from itself. + assert hello.import_self() is hello + + # On the other hand without a source will fall flat on the floor. + try: + from dummy.plugins import hello + except RuntimeError: + pass + else: + assert False, 'Expected a runtime error but managed to ' \ + 'import hello (%s)' % hello + + +def test_fetching_plugin_source(source): + # Finding the plugin source outside of a plugin and without a with + # block of a plugin source returns None. + assert get_plugin_source() is None + + # Inside a source block we can find the source through mere calling. + with source: + assert get_plugin_source() is source + + # A module can always find its own source as well (the hello module + # calls get_plugin_source() itself). + with source: + from dummy.plugins import hello + assert hello.get_plugin_source() is source + + # Last but not least the plugin source can be found by module names + # (in a plugin source block by the import name and in any case by + # the internal name) + with source: + assert get_plugin_source('dummy.plugins.hello') is source + assert get_plugin_source(hello.__name__) is source + + # As well as by module object. + assert get_plugin_source(hello) is source + + +def test_cleanup(base): + new_source = base.make_plugin_source(searchpath=['./plugins']) + mod_name = new_source.mod.__name__ + assert sys.modules.get(mod_name) is new_source.mod + + with new_source: + from dummy.plugins import hello + + new_source = None + assert sys.modules.get(mod_name) is None + assert hello.import_self is None + + +def test_persist(base): + new_source = base.make_plugin_source(searchpath=['./plugins'], + persist=True) + mod_name = new_source.mod.__name__ + assert sys.modules.get(mod_name) is new_source.mod + + with new_source: + from dummy.plugins import hello + + new_source = None + assert sys.modules.get(mod_name) is not None + assert hello.import_self is not None + sys.modules[mod_name].__pluginbase_state__.source.cleanup() + assert sys.modules.get(mod_name) is None + assert hello.import_self is None + + +def test_list_plugins(source): + plugins = source.list_plugins() + hello_plugins = [x for x in plugins if x.startswith('hello')] + assert hello_plugins == ['hello', 'hello2'] + + +def test_load_plugin(source): + hello = source.load_plugin('hello') + assert hello.demo_func() == 42 |
