Exemple #1
0
def test_set_plugin_source_conf_valid(factories):
    library = factories["music.Library"](actor__local=True)
    _plugins = {}
    plugins.get_plugin_config(
        "test",
        source=True,
        registry=_plugins,
        conf=[{
            "name": "foo",
            "type": "boolean"
        }],
    )
    plugins.set_conf(
        "test",
        {
            "foo": True,
            "library": library.uuid
        },
        user=library.actor.user,
        registry=_plugins,
    )
    conf = models.PluginConfiguration.objects.latest("id")
    assert conf.code == "test"
    assert conf.conf == {"foo": True, "library": str(library.uuid)}
    assert conf.user == library.actor.user
Exemple #2
0
def test_set_plugin_conf_validates():
    _plugins = {}
    plugins.get_plugin_config("test",
                              registry=_plugins,
                              conf=[{
                                  "name": "foo",
                                  "type": "boolean"
                              }])

    with pytest.raises(serializers.ValidationError):
        plugins.set_conf("test", {"foo": "noop"}, registry=_plugins)
Exemple #3
0
def test_set_plugin_source_conf_invalid(factories):
    user = factories["users.User"]()
    _plugins = {}
    plugins.get_plugin_config(
        "test",
        source=True,
        registry=_plugins,
        conf=[{
            "name": "foo",
            "type": "boolean"
        }],
    )
    with pytest.raises(serializers.ValidationError):
        plugins.set_conf("test", {"foo": True}, user=user, registry=_plugins)
Exemple #4
0
def test_set_plugin_conf_valid():
    _plugins = {}
    plugins.get_plugin_config("test",
                              registry=_plugins,
                              conf=[{
                                  "name": "foo",
                                  "type": "boolean"
                              }])
    plugins.set_conf("test", {"foo": True}, registry=_plugins)

    conf = models.PluginConfiguration.objects.latest("id")
    assert conf.code == "test"
    assert conf.conf == {"foo": True}
    assert conf.user is None
Exemple #5
0
def test_serialize_plugin_user(factories):
    user = factories["users.User"]()
    plugin = plugins.get_plugin_config(
        name="test_plugin",
        description="Hello world",
        conf=[{
            "name": "foo",
            "type": "boolean"
        }],
        user=True,
    )

    expected = {
        "name": "test_plugin",
        "enabled": False,
        "description": "Hello world",
        "conf": [{
            "name": "foo",
            "type": "boolean"
        }],
        "user": True,
        "source": False,
        "label": "test_plugin",
        "values": None,
        "homepage": None,
    }

    assert plugins.serialize_plugin(plugin,
                                    plugins.get_confs(user)) == expected
Exemple #6
0
def test_set_plugin_conf_valid_user(factories):
    user = factories["users.User"]()
    _plugins = {}
    plugins.get_plugin_config("test",
                              registry=_plugins,
                              conf=[{
                                  "name": "foo",
                                  "type": "boolean"
                              }])

    plugins.set_conf("test", {"foo": True}, user=user, registry=_plugins)

    conf = models.PluginConfiguration.objects.latest("id")
    assert conf.code == "test"
    assert conf.conf == {"foo": True}
    assert conf.user == user
Exemple #7
0
def test_can_update_user_plugin(logged_in_api_client):
    plugin = plugins.get_plugin_config(
        name="test_plugin",
        description="Hello world",
        conf=[{
            "name": "foo",
            "type": "boolean"
        }],
        user=True,
    )
    plugins.get_plugin_config(name="test_plugin2", user=False)
    url = reverse("api:v1:plugins-detail", kwargs={"pk": "test_plugin"})
    response = logged_in_api_client.post(url, {"foo": True})
    assert response.status_code == 200
    assert logged_in_api_client.user.plugins.latest("id").conf == {"foo": True}
    assert response.data == plugins.serialize_plugin(
        plugin, plugins.get_confs(logged_in_api_client.user))
Exemple #8
0
def test_can_disable_user_plugin(logged_in_api_client):
    plugins.get_plugin_config(
        name="test_plugin",
        description="Hello world",
        conf=[{
            "name": "foo",
            "type": "boolean"
        }],
        user=True,
    )
    plugins.set_conf("test_plugin", {"foo": True},
                     user=logged_in_api_client.user)
    url = reverse("api:v1:plugins-disable", kwargs={"pk": "test_plugin"})
    response = logged_in_api_client.post(url)
    assert response.status_code == 200

    assert logged_in_api_client.user.plugins.latest("id").enabled is False
Exemple #9
0
def test_can_list_user_plugins(logged_in_api_client):
    plugin = plugins.get_plugin_config(
        name="test_plugin",
        description="Hello world",
        conf=[{
            "name": "foo",
            "type": "boolean"
        }],
        user=True,
    )
    plugins.get_plugin_config(name="test_plugin2", user=False)
    url = reverse("api:v1:plugins-list")
    response = logged_in_api_client.get(url)

    assert response.status_code == 200
    assert response.data == [
        plugins.serialize_plugin(plugin,
                                 plugins.get_confs(logged_in_api_client.user))
    ]
Exemple #10
0
def test_can_destroy_user_plugin(logged_in_api_client):
    plugins.get_plugin_config(
        name="test_plugin",
        description="Hello world",
        conf=[{
            "name": "foo",
            "type": "boolean"
        }],
        user=True,
    )
    plugins.set_conf("test_plugin", {"foo": True},
                     user=logged_in_api_client.user)
    plugins.get_plugin_config(name="test_plugin2", user=False)
    url = reverse("api:v1:plugins-detail", kwargs={"pk": "test_plugin"})
    response = logged_in_api_client.delete(url, {"enabled": True})
    assert response.status_code == 204

    with pytest.raises(models.PluginConfiguration.DoesNotExist):
        assert logged_in_api_client.user.plugins.latest("id")
Exemple #11
0
def test_get_plugin_conf():
    _plugins = {}
    plugin_config = plugins.get_plugin_config("test",
                                              description="Hello",
                                              registry=_plugins)
    assert plugin_config["name"] == "test"
    assert plugin_config["description"] == "Hello"
    assert plugin_config["user"] is False
    assert _plugins == {
        "test": plugin_config,
    }
Exemple #12
0
def test_filter_is_called_with_plugin_conf(mocker, factories):
    plugins.get_plugin_config("test1", )
    plugins.get_plugin_config("test2", )
    factories["common.PluginConfiguration"](code="test1", enabled=True)
    factories["common.PluginConfiguration"](code="test2",
                                            conf={
                                                "foo": "baz"
                                            },
                                            enabled=True)
    confs = plugins.get_confs()
    filters = {}
    plugin_config1 = plugins.get_plugin_config("test1", {})
    plugin_config2 = plugins.get_plugin_config("test2", {})

    handler1 = mocker.Mock()
    handler2 = mocker.Mock()

    plugins.register_filter("test_filter", plugin_config1, filters)(handler1)
    plugins.register_filter("test_filter", plugin_config2, filters)(handler2)

    plugins.trigger_filter("test_filter", 1, confs=confs, registry=filters)

    handler1.assert_called_once_with(1, conf=confs["test1"])
    handler2.assert_called_once_with(handler1.return_value,
                                     conf=confs["test2"])
Exemple #13
0
def test_register_hook(mocker):
    hooks = {}
    plugin_config = plugins.get_plugin_config("test", {})
    mock = mocker.Mock()

    def handler(conf):
        mock()

    plugins.register_hook("test_hook", plugin_config, hooks)(handler)
    plugins.register_hook("test_hook", plugin_config, hooks)(handler)
    plugins.trigger_hook("test_hook", confs={}, registry=hooks)
    assert mock.call_count == 2
    assert len(hooks["test_hook"]) == 2
Exemple #14
0
def test_register_filter():
    filters = {}
    plugin_config = plugins.get_plugin_config("test", {})

    def handler(value, conf):
        return value + 1

    plugins.register_filter("test_filter", plugin_config, filters)(handler)
    plugins.register_filter("test_filter", plugin_config, filters)(handler)

    assert len(filters["test_filter"]) == 2
    assert plugins.trigger_filter("test_filter", 1, confs={},
                                  registry=filters) == 3
Exemple #15
0
def test_get_confs(factories):
    plugins.get_plugin_config("test1")
    plugins.get_plugin_config("test2")
    factories["common.PluginConfiguration"](code="test1",
                                            conf={
                                                "hello": "world"
                                            })
    factories["common.PluginConfiguration"](code="test2", conf={"foo": "bar"})

    assert plugins.get_confs() == {
        "test1": {
            "conf": {
                "hello": "world"
            },
            "enabled": False
        },
        "test2": {
            "conf": {
                "foo": "bar"
            },
            "enabled": False
        },
    }
Exemple #16
0
def test_can_trigger_scan(logged_in_api_client, mocker, factories):
    library = factories["music.Library"](
        actor=logged_in_api_client.user.create_actor())
    plugin = plugins.get_plugin_config(
        name="test_plugin",
        description="Hello world",
        conf=[],
        source=True,
    )
    handler = mocker.Mock()
    plugins.register_hook(plugins.SCAN, plugin)(handler)
    plugins.set_conf("test_plugin", {"library": library.uuid},
                     user=logged_in_api_client.user)
    url = reverse("api:v1:plugins-scan", kwargs={"pk": "test_plugin"})
    plugins.enable_conf("test_plugin", True, logged_in_api_client.user)
    response = logged_in_api_client.post(url)
    assert response.status_code == 200

    handler.assert_called_once_with(library=library,
                                    conf={"library": str(library.uuid)})
Exemple #17
0
def test_serialize_plugin_user_enabled(factories):
    user = factories["users.User"]()
    plugin = plugins.get_plugin_config(
        name="test_plugin",
        description="Hello world",
        conf=[{
            "name": "foo",
            "type": "boolean"
        }],
        user=True,
        homepage="https://example.com",
    )

    factories["common.PluginConfiguration"](code="test_plugin",
                                            user=user,
                                            enabled=True,
                                            conf={
                                                "foo": "bar"
                                            })
    expected = {
        "name": "test_plugin",
        "enabled": True,
        "description": "Hello world",
        "conf": [{
            "name": "foo",
            "type": "boolean"
        }],
        "user": True,
        "source": False,
        "label": "test_plugin",
        "values": {
            "foo": "bar"
        },
        "homepage": "https://example.com",
    }

    assert plugins.serialize_plugin(plugin,
                                    plugins.get_confs(user)) == expected
Exemple #18
0
def test_get_confs_user(factories):
    plugins.get_plugin_config("test1")
    plugins.get_plugin_config("test2")
    plugins.get_plugin_config("test3")
    user1 = factories["users.User"]()
    user2 = factories["users.User"]()
    factories["common.PluginConfiguration"](code="test1",
                                            conf={
                                                "hello": "world"
                                            })
    factories["common.PluginConfiguration"](code="test2", conf={"foo": "bar"})
    factories["common.PluginConfiguration"](code="test3",
                                            conf={
                                                "user": True
                                            },
                                            user=user1)
    factories["common.PluginConfiguration"](code="test4",
                                            conf={
                                                "user": False
                                            },
                                            user=user2)

    assert plugins.get_confs(user=user1) == {
        "test1": {
            "conf": {
                "hello": "world"
            },
            "enabled": False
        },
        "test2": {
            "conf": {
                "foo": "bar"
            },
            "enabled": False
        },
        "test3": {
            "conf": {
                "user": True
            },
            "enabled": False
        },
    }
Exemple #19
0
from config import plugins

PLUGIN = plugins.get_plugin_config(
    name="predatumscrobbler",
    label="Predatum scrobbler",
    description=
    "A Flunkwhale plugin that allows you to submit your listens to predatum.",
    version="0.1",
    user=True,
    conf=[
        {
            "name": "username",
            "type": "text",
            "label": "Predatum username"
        },
        {
            "name": "password",
            "type": "password",
            "label": "Predatum password"
        },
    ],
)
Exemple #20
0
PLUGIN = plugins.get_plugin_config(
    name="scrobbler",
    label="Scrobbler",
    description=(
        "A plugin that enables scrobbling to ListenBrainz and Last.fm. "
        "It must be configured on the server if you use Last.fm."),
    homepage=
    "https://dev.funkwhale.audio/funkwhale/funkwhale/-/blob/develop/api/funkwhale_api/contrib/scrobbler/README.rst",  # noqa
    version="0.1",
    user=True,
    conf=[
        {
            "name":
            "url",
            "type":
            "url",
            "allow_null":
            True,
            "allow_blank":
            True,
            "required":
            False,
            "label":
            "URL of the scrobbler service",
            "help":
            ("Suggested choices:\n\n"
             "- LastFM (default if left empty): http://post.audioscrobbler.com\n"
             "- ListenBrainz: http://proxy.listenbrainz.org/\n"
             "- Libre.fm: http://turtle.libre.fm/"),
        },
        {
            "name": "username",
            "type": "text",
            "label": "Your scrobbler username"
        },
        {
            "name": "password",
            "type": "password",
            "label": "Your scrobbler password"
        },
    ],
    settings=[
        {
            "name": "lastfm_api_key",
            "type": "text"
        },
        {
            "name": "lastfm_api_secret",
            "type": "text"
        },
    ],
)