diff --git a/app/plugins/functions.py b/app/plugins/functions.py
index 34a96c45..9b2f99c0 100644
--- a/app/plugins/functions.py
+++ b/app/plugins/functions.py
@@ -27,6 +27,11 @@ def sync_plugin_db():
Creates db entries for undiscovered plugins to keep track
of enabled/disabled plugins
"""
+
+ # Erase cache
+ global plugins
+ plugins = None
+
db_plugins = Plugin.objects.all()
fs_plugins = get_plugins()
diff --git a/app/tests/test_plugins.py b/app/tests/test_plugins.py
index 63617acb..fa7ae981 100644
--- a/app/tests/test_plugins.py
+++ b/app/tests/test_plugins.py
@@ -1,13 +1,16 @@
import os
+import shutil
from django.contrib.auth.models import User
from django.test import Client
from rest_framework import status
+from app.models import Plugin
from app.models import Project
from app.models import Task
from app.plugins import UserDataStore
from app.plugins import get_plugin_by_name
+from app.plugins import sync_plugin_db
from app.plugins.data_store import InvalidDataStoreValue
from .classes import BootTestCase
from app.plugins.grass_engine import grass, GrassEngineException
@@ -185,3 +188,59 @@ class TestPlugins(BootTestCase):
# Invalid types
self.assertRaises(InvalidDataStoreValue, uds.set_bool, 'invalidbool', 5)
+ def test_toggle_plugins(self):
+ c = Client()
+ c.login(username='testuser', password='test1234')
+
+ # Cannot toggle plugins as normal user
+ res = c.get('/admin/app/plugin/test/disable/', follow=True)
+ self.assertRedirects(res, '/admin/login/?next=/admin/app/plugin/test/disable/')
+
+ c.login(username='testsuperuser', password='test1234')
+
+ # Test plugin is enabled
+ res = c.get('/admin/app/plugin/')
+ self.assertContains(res, 'Enable')
+ self.assertContains(res, "")
+
+ # Disable
+ res = c.get('/admin/app/plugin/test/disable/', follow=True)
+ self.assertEqual(res.status_code, status.HTTP_200_OK)
+
+ # Test active vs. non-active flag for get_plugin_by_name
+ self.assertTrue(get_plugin_by_name("test") is None)
+ self.assertFalse(get_plugin_by_name("test", only_active=False) is None)
+
+ # Test plugin has been disabled
+ self.assertContains(res, 'Disable')
+ self.assertNotContains(res, "")
+
+ # Re-enable
+ res = c.get('/admin/app/plugin/test/enable/', follow=True)
+ self.assertEqual(res.status_code, status.HTTP_200_OK)
+
+
+ def test_plugin_functions(self):
+ # Check db/fs syncing
+ if os.path.exists('plugins/test_copy'):
+ print("Removing plugins/test_copy")
+ shutil.rmtree('plugins/test_copy')
+
+ sync_plugin_db()
+ self.assertTrue(Plugin.objects.filter(pk='test_copy').count() == 0)
+
+ shutil.copytree('plugins/test', 'plugins/test_copy')
+
+ sync_plugin_db()
+ self.assertTrue(Plugin.objects.filter(pk='test_copy').count() == 1)
+
+ shutil.rmtree('plugins/test_copy')
+ sync_plugin_db()
+ self.assertTrue(Plugin.objects.filter(pk='test_copy').count() == 0)
+
+ # Get manifest works and parses JSON
+ p = get_plugin_by_name("test")
+ self.assertEqual(p.get_manifest()['author'], "Piero Toffanin")
+
+
+