Skip to content
Snippets Groups Projects
test_plugins.py 3.31 KiB
Newer Older
Eliot Berriot's avatar
Eliot Berriot committed
from funkwhale_api.common import plugins

# setup code to populate plugins registry
# plugin-to-user -> enable and configure
# plugin preferences


def test_plugin_register(plugins_registry):
    class TestPlugin(plugins.Plugin):
        name = "scrobbler"
        verbose_name = "Audio Scrobbler"

    inst = TestPlugin(app_name="scrobbler", app_module="")
    plugins_registry.register(inst)

    assert inst.plugins_registry == plugins_registry
    assert inst.is_initialized is False
    assert plugins_registry["scrobbler"] == inst
    assert inst.config == {}


def test_plugin_get_config(plugins_registry):
    class TestPlugin(plugins.Plugin):
        name = "scrobbler"
        verbose_name = "Audio Scrobbler"

    plugin = TestPlugin(app_name="", app_module="")
    assert plugin.get_config({"hello": "world"}) == {"hello": "world"}


def test_plugin_set_config(plugins_registry):
    class TestPlugin(plugins.Plugin):
        name = "scrobbler"
        verbose_name = "Audio Scrobbler"

    plugin = TestPlugin(app_name="", app_module="")
    plugin.set_config({"hello": "world"})
    assert plugin.config == {"hello": "world"}


def test_plugin_initialize(plugins_registry):
    class TestPlugin(plugins.Plugin):
        name = "scrobbler"
        verbose_name = "Audio Scrobbler"

    plugin = TestPlugin(app_name="", app_module="")
    assert plugin.initialize() is None


def test_action(mocker, plugins_registry):
    class TestPlugin(plugins.Plugin):
        name = "scrobbler"
        verbose_name = "Audio Scrobbler"

    inst = TestPlugin(app_name="scrobbler", app_module="")
    plugins_registry.register(inst)

    stub = mocker.stub()

    # nothing hooked, so stub is not called
    plugins_registry.dispatch_action("hello", user="test", arg1="value1", arg2="value2")
    stub.assert_not_called()

    # now we hook the stub on the action
    inst.register_action("hello", stub)
    assert inst.hooked_actions == {"hello": stub}
    plugins_registry.dispatch_action("hello", user="test", arg1="value1", arg2="value2")

    stub.assert_called_once_with(plugin=inst, user="test", arg1="value1", arg2="value2")


def test_plugins_init(plugins_registry, mocker):
    class TestPlugin1(plugins.Plugin):
        name = "scrobbler"
        verbose_name = "Audio Scrobbler"

    class TestPlugin2(plugins.Plugin):
        name = "webhooks"
        verbose_name = "Webhooks"

    plugin1 = TestPlugin1(app_name="scrobbler", app_module="")
    plugin2 = TestPlugin2(app_name="webhooks", app_module="")

    mocks = {}
    for plugin in [plugin1, plugin2]:
        d = {
            "get_config": mocker.patch.object(plugin, "get_config"),
            "set_config": mocker.patch.object(plugin, "set_config"),
            "initialize": mocker.patch.object(plugin, "initialize"),
        }
        mocks[plugin.name] = d

    autodiscover = mocker.patch.object(plugins_registry, "autodiscover")
    plugins.init(plugins_registry, [plugin1, plugin2])

    autodiscover.assert_called_once_with([plugin1.name, plugin2.name])

    for mock_conf in mocks.values():
        mock_conf["get_config"].assert_called_once_with({})
        mock_conf["set_config"].assert_called_once_with(
            mock_conf["get_config"].return_value
        )
        mock_conf["initialize"].assert_called_once_with()

    assert plugin1.is_initialized is True
    assert plugin2.is_initialized is True