From 1c7ceca4328218b6a26698542685d060998edae7 Mon Sep 17 00:00:00 2001 From: Roberto Rosario Date: Fri, 26 Jul 2019 15:49:07 -0400 Subject: [PATCH] Add file caching tests Signed-off-by: Roberto Rosario --- mayan/apps/file_caching/apps.py | 2 +- mayan/apps/file_caching/tests/__init__.py | 0 mayan/apps/file_caching/tests/literals.py | 9 ++ mayan/apps/file_caching/tests/mixins.py | 70 +++++++++++++++ mayan/apps/file_caching/tests/test_events.py | 42 +++++++++ mayan/apps/file_caching/tests/test_models.py | 18 ++++ mayan/apps/file_caching/tests/test_views.py | 89 ++++++++++++++++++++ mayan/apps/file_caching/views.py | 2 +- 8 files changed, 230 insertions(+), 2 deletions(-) create mode 100644 mayan/apps/file_caching/tests/__init__.py create mode 100644 mayan/apps/file_caching/tests/literals.py create mode 100644 mayan/apps/file_caching/tests/mixins.py create mode 100644 mayan/apps/file_caching/tests/test_events.py create mode 100644 mayan/apps/file_caching/tests/test_models.py create mode 100644 mayan/apps/file_caching/tests/test_views.py diff --git a/mayan/apps/file_caching/apps.py b/mayan/apps/file_caching/apps.py index a4eaa248b7..79bb81006a 100644 --- a/mayan/apps/file_caching/apps.py +++ b/mayan/apps/file_caching/apps.py @@ -25,7 +25,7 @@ from .permissions import permission_cache_purge, permission_cache_view class FileCachingConfig(MayanAppConfig): app_namespace = 'file_caching' app_url = 'file_caching' - has_tests = False + has_tests = True name = 'mayan.apps.file_caching' verbose_name = _('File caching') diff --git a/mayan/apps/file_caching/tests/__init__.py b/mayan/apps/file_caching/tests/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/mayan/apps/file_caching/tests/literals.py b/mayan/apps/file_caching/tests/literals.py new file mode 100644 index 0000000000..5d9d8ca140 --- /dev/null +++ b/mayan/apps/file_caching/tests/literals.py @@ -0,0 +1,9 @@ +from __future__ import unicode_literals + +TEST_CACHE_LABEL = 'test cache label' +TEST_CACHE_MAXIMUM_SIZE = 2 * 2 ** 20 # 2 Megabyte +TEST_CACHE_NAME = 'test_cache_name' +TEST_CACHE_PARTITION_FILE_FILENAME = 'test_cache_partition_file_filename' +TEST_CACHE_PARTITION_FILE_SIZE = 1 * 2 ** 20 # 1 Megabyte +TEST_CACHE_PARTITION_NAME = 'test_cache_partition_name' +TEST_CACHE_STORAGE_INSTANCE_PATH = 'mayan.apps.file_caching.tests.mixins.test_storage' diff --git a/mayan/apps/file_caching/tests/mixins.py b/mayan/apps/file_caching/tests/mixins.py new file mode 100644 index 0000000000..480b28249d --- /dev/null +++ b/mayan/apps/file_caching/tests/mixins.py @@ -0,0 +1,70 @@ +from __future__ import unicode_literals + +from django.core.files.storage import FileSystemStorage +from django.utils.encoding import force_bytes + +from mayan.apps.storage.utils import fs_cleanup, mkdtemp + +from ..models import Cache + +from .literals import ( + TEST_CACHE_LABEL, TEST_CACHE_MAXIMUM_SIZE, TEST_CACHE_NAME, + TEST_CACHE_PARTITION_FILE_FILENAME, TEST_CACHE_PARTITION_FILE_SIZE, + TEST_CACHE_PARTITION_NAME, TEST_CACHE_STORAGE_INSTANCE_PATH +) + +test_storage = None + + +class CacheTestMixin(object): + def setUp(self): + global test_storage + self.temporary_directory = mkdtemp() + test_storage = FileSystemStorage(location=self.temporary_directory) + super(CacheTestMixin, self).setUp() + + def tearDown(self): + super(CacheTestMixin, self).tearDown() + fs_cleanup(filename=self.temporary_directory) + + def _create_test_cache(self): + self.test_cache = Cache.objects.create( + label=TEST_CACHE_LABEL, + storage_instance_path=TEST_CACHE_STORAGE_INSTANCE_PATH, + maximum_size=TEST_CACHE_MAXIMUM_SIZE, + name=TEST_CACHE_NAME, + ) + + def _create_test_cache_partition(self): + self.test_cache_partition = self.test_cache.partitions.create( + name=TEST_CACHE_PARTITION_NAME + ) + + def _create_test_cache_partition_file(self): + with self.test_cache_partition.create_file(filename=TEST_CACHE_PARTITION_FILE_FILENAME) as file_object: + file_object.write( + force_bytes(' ' * TEST_CACHE_PARTITION_FILE_SIZE) + ) + + self.test_cache_partition_file = self.test_cache_partition.files.get( + filename=TEST_CACHE_PARTITION_FILE_FILENAME + ) + + +class CacheViewTestMixin(object): + def _request_test_cache_list_view(self): + return self.get(viewname='file_caching:cache_list') + + def _request_test_cache_purge_view(self): + return self.post( + viewname='file_caching:cache_purge', kwargs={ + 'cache_id': self.test_cache.pk + } + ) + + def _request_test_cache_multiple_purge_view(self): + return self.post( + viewname='file_caching:cache_multiple_purge', data={ + 'id_list': self.test_cache.pk + } + ) diff --git a/mayan/apps/file_caching/tests/test_events.py b/mayan/apps/file_caching/tests/test_events.py new file mode 100644 index 0000000000..023da0dea8 --- /dev/null +++ b/mayan/apps/file_caching/tests/test_events.py @@ -0,0 +1,42 @@ +from __future__ import unicode_literals + +from actstream.models import Action + +from mayan.apps.common.tests import BaseTestCase + +from ..events import event_cache_created, event_cache_purged +from ..models import Cache + +from .mixins import CacheTestMixin + + +class CacheEventsTestCase(CacheTestMixin, BaseTestCase): + def test_cache_create_event(self): + action_count = Action.objects.count() + + self._create_test_cache() + + self.assertEqual(Action.objects.count(), action_count + 1) + + event = Action.objects.first() + + cache = Cache.objects.last() + + self.assertEqual(event.verb, event_cache_created.id) + self.assertEqual(event.target, cache) + + def test_cache_purge_event(self): + self._create_test_cache() + + action_count = Action.objects.count() + + self.test_cache.purge() + + self.assertEqual(Action.objects.count(), action_count + 1) + + event = Action.objects.first() + + cache = Cache.objects.last() + + self.assertEqual(event.verb, event_cache_purged.id) + self.assertEqual(event.target, cache) diff --git a/mayan/apps/file_caching/tests/test_models.py b/mayan/apps/file_caching/tests/test_models.py new file mode 100644 index 0000000000..4c7871bc70 --- /dev/null +++ b/mayan/apps/file_caching/tests/test_models.py @@ -0,0 +1,18 @@ +from __future__ import unicode_literals + +from mayan.apps.common.tests import BaseTestCase + +from .mixins import CacheTestMixin + + +class CacheModelTestCase(CacheTestMixin, BaseTestCase): + def test_cache_purge(self): + self._create_test_cache() + self._create_test_cache_partition() + self._create_test_cache_partition_file() + + cache_total_size = self.test_cache.get_total_size() + + self.test_cache.purge() + + self.assertNotEqual(cache_total_size, self.test_cache.get_total_size()) diff --git a/mayan/apps/file_caching/tests/test_views.py b/mayan/apps/file_caching/tests/test_views.py new file mode 100644 index 0000000000..7b2a92a25d --- /dev/null +++ b/mayan/apps/file_caching/tests/test_views.py @@ -0,0 +1,89 @@ +from __future__ import unicode_literals + +from mayan.apps.common.tests import GenericViewTestCase + +from ..permissions import ( + permission_cache_purge, permission_cache_view +) + +from .mixins import CacheTestMixin, CacheViewTestMixin + + +class CacheViewTestCase( + CacheTestMixin, CacheViewTestMixin, GenericViewTestCase +): + def test_cache_list_view_with_no_permission(self): + self._create_test_cache() + + response = self._request_test_cache_list_view() + self.assertNotContains( + response=response, text=self.test_cache.label, status_code=200 + ) + + def test_cache_list_view_with_access(self): + self._create_test_cache() + + self.grant_access( + obj=self.test_cache, permission=permission_cache_view + ) + + response = self._request_test_cache_list_view() + self.assertContains( + response=response, text=self.test_cache.label, status_code=200 + ) + + def test_cache_purge_view_no_permissions(self): + self._create_test_cache() + self._create_test_cache_partition() + self._create_test_cache_partition_file() + + cache_total_size = self.test_cache.get_total_size() + + response = self._request_test_cache_purge_view() + self.assertEqual(response.status_code, 404) + + self.assertEqual(cache_total_size, self.test_cache.get_total_size()) + + def test_cache_purge_view_with_access(self): + self._create_test_cache() + self._create_test_cache_partition() + self._create_test_cache_partition_file() + + self.grant_access( + obj=self.test_cache, permission=permission_cache_purge + ) + + cache_total_size = self.test_cache.get_total_size() + + response = self._request_test_cache_purge_view() + self.assertEqual(response.status_code, 302) + + self.assertNotEqual(cache_total_size, self.test_cache.get_total_size()) + + def test_cache_multiple_purge_view_no_permissions(self): + self._create_test_cache() + self._create_test_cache_partition() + self._create_test_cache_partition_file() + + cache_total_size = self.test_cache.get_total_size() + + response = self._request_test_cache_multiple_purge_view() + self.assertEqual(response.status_code, 404) + + self.assertEqual(cache_total_size, self.test_cache.get_total_size()) + + def test_cache_multiple_purge_view_with_access(self): + self._create_test_cache() + self._create_test_cache_partition() + self._create_test_cache_partition_file() + + self.grant_access( + obj=self.test_cache, permission=permission_cache_purge + ) + + cache_total_size = self.test_cache.get_total_size() + + response = self._request_test_cache_multiple_purge_view() + self.assertEqual(response.status_code, 302) + + self.assertNotEqual(cache_total_size, self.test_cache.get_total_size()) diff --git a/mayan/apps/file_caching/views.py b/mayan/apps/file_caching/views.py index bf0d86ef7e..c747b14b78 100644 --- a/mayan/apps/file_caching/views.py +++ b/mayan/apps/file_caching/views.py @@ -15,7 +15,7 @@ from .tasks import task_cache_purge class CacheListView(SingleObjectListView): model = Cache - permission = permission_cache_view + object_permission = permission_cache_view def get_extra_context(self): return {