Settings unit test

pull/318/head
Piero Toffanin 2017-11-09 15:45:29 -05:00
rodzic 63be0b100b
commit ad46350efb
4 zmienionych plików z 146 dodań i 5 usunięć

Wyświetl plik

@ -71,18 +71,16 @@ def boot():
Preset.objects.get_or_create(name='Default', system=True, options=[{'name': 'dsm', 'value': True}])
# Add settings
# Setting.objects.all().delete()
# Theme.objects.all().delete()
default_theme, created = Theme.objects.get_or_create(name='Default')
if created:
logger.info("Created default theme")
if Setting.objects.all().count() == 0:
default_logo = os.path.join('app', 'static', 'app', 'img', 'logo512.png')
s = Setting.objects.create(
app_name='WebODM',
theme=default_theme)
default_logo = os.path.join('app', 'static', 'app', 'img', 'logo512.png')
s.app_logo.save(os.path.basename(default_logo), File(open(default_logo, 'rb')))
logger.info("Created settings")

Wyświetl plik

@ -1,6 +1,7 @@
import logging
import os
from django.core.exceptions import ValidationError
from django.db.models import signals
from django.db import models
from django.dispatch import receiver
@ -8,6 +9,10 @@ from imagekit.models import ImageSpecField
from imagekit.processors import ResizeToFit
from pathlib import Path
from shutil import rmtree
from webodm import settings
from .theme import Theme
logger = logging.getLogger('app.logger')
@ -30,20 +35,61 @@ class Setting(models.Model):
theme = models.ForeignKey(Theme, blank=False, null=False, on_delete=models.DO_NOTHING,
help_text="Active theme")
def __init__(self, *args, **kwargs):
super(Setting, self).__init__(*args, **kwargs)
# To help keep track of changes to the app_logo
self.__original_app_logo_name = self.app_logo.name
def save(self, *args, **kwargs):
# Cleanup old logo files if needed
if self.__original_app_logo_name != "" and \
self.app_logo.name != self.__original_app_logo_name:
old_logo_path = os.path.join(settings.MEDIA_ROOT, self.__original_app_logo_name)
old_logo_path_caches = os.path.join(settings.MEDIA_ROOT,
"CACHE",
"images",
os.path.splitext(self.__original_app_logo_name)[0])
if os.path.exists(old_logo_path):
try:
os.unlink(old_logo_path)
logger.info("Removed {}".format(old_logo_path))
except:
logger.warning("Cannot cleanup {}".format(old_logo_path))
if os.path.exists(old_logo_path_caches):
try:
rmtree(old_logo_path_caches)
logger.info("Removed {}".format(old_logo_path_caches))
except:
logger.warning("Cannot cleanup {}".format(old_logo_path_caches))
self.__original_app_logo_name = self.app_logo.name
super(Setting, self).save(*args, **kwargs)
def __str__(self):
return "Application"
@receiver(signals.pre_save, sender=Setting, dispatch_uid="setting_pre_save")
def setting_pre_save(sender, instance, **kwargs):
if Setting.objects.count() > 0 and instance.id != Setting.objects.get().id:
raise ValidationError("Can only create 1 %s instance" % Setting.__name__)
@receiver(signals.post_save, sender=Setting, dispatch_uid="setting_post_save")
def setting_post_save(sender, instance, created, **kwargs):
"""
Touch theme.scss to invalidate its cache and force
compressor to regenerate it
"""
theme_file = os.path.join('app', 'static', 'app', 'css', 'theme.scss')
try:
Path(theme_file).touch()
logger.info("Touched {}".format(theme_file))
except:
logger.warning("Failed to touch {}".format(theme_file))

Wyświetl plik

@ -1,10 +1,14 @@
import os
from django import db
from django.contrib.auth.models import User
from django.test import TestCase
from django.test import TransactionTestCase
from shutil import rmtree
from app.boot import boot
from app.models import Project
from webodm import settings
def setupUsers():
@ -36,6 +40,15 @@ def setupProjects():
description="This is a test project"
)
def cleanup():
if settings.TESTING and \
os.path.exists(settings.MEDIA_ROOT) and \
"_test" in settings.MEDIA_ROOT[-6:]:
rmtree(settings.MEDIA_ROOT)
print("Cleaned " + settings.MEDIA_ROOT)
class BootTestCase(TestCase):
'''
This class provides optional default mock data as well as
@ -48,6 +61,7 @@ class BootTestCase(TestCase):
@classmethod
def setUpTestData(cls):
super(BootTestCase, cls).setUpTestData()
cleanup()
boot()
setupUsers()
setupProjects()
@ -63,6 +77,7 @@ class BootTransactionTestCase(TransactionTestCase):
'''
def setUp(self):
super().setUp()
cleanup()
boot()
setupUsers()
setupProjects()

Wyświetl plik

@ -0,0 +1,82 @@
import os
from django.contrib.auth.models import User, Group
from django.core.exceptions import ValidationError
from django.core.files import File
from django.test import Client
from shutil import rmtree
from app.models import Setting
from app.models import Theme
from .classes import BootTestCase
from app.contexts.settings import load as load_settings
from webodm import settings as webodm_settings
class TestSettings(BootTestCase):
def setUp(self):
pass
def tearDown(self):
pass
def test_settings(self):
# There should always be a Setting object
self.assertTrue(Setting.objects.count() == 1, "There's a settings object")
# There should be "default" Theme object
self.assertTrue(Theme.objects.filter(name="Default").count() == 1, "Default theme found")
# The default settings use the default theme
self.assertTrue(Setting.objects.first().theme.id == Theme.objects.get(name="Default").id, "Default theme is associated to settings")
# We can create a new theme object
second_theme = Theme.objects.create(name="Second")
# We cannot add another setting objects
with self.assertRaises(ValidationError):
Setting.objects.create(app_name="Test", theme=second_theme)
# We can retrieve the settings
settings = load_settings()['SETTINGS']
self.assertTrue(settings is not None, "Can retrieve settings")
# The default logo has been created in the proper destination
default_logo_path = os.path.join(webodm_settings.MEDIA_ROOT, settings.app_logo.name)
self.assertTrue(os.path.exists(default_logo_path), "Default logo exists in MEDIA_ROOT/settings")
# Access smaller logo (should generate a cached copy),
# and check that's been created
print("Access: " + settings.app_logo_favicon.url)
favicon_path = os.path.join(webodm_settings.MEDIA_ROOT, settings.app_logo_favicon.name)
self.assertTrue(os.path.exists(favicon_path), "Favicon logo exists")
# We can update the logo
logo = os.path.join('app', 'static', 'app', 'img', 'favicon.png')
settings.app_logo.save(os.path.basename(logo), File(open(logo, 'rb')))
settings.save()
# The main logo has been uploaded
self.assertTrue("favicon" in settings.app_logo.name, "Logo has been updated")
self.assertTrue(os.path.exists(os.path.join(webodm_settings.MEDIA_ROOT, settings.app_logo.name)),
"New logo exists in MEDIA_ROOT/settings")
# The old logo does not exist anymore
self.assertFalse(os.path.exists(default_logo_path),
"Old logo has been deleted")
# The old logo caches are gone also
self.assertFalse(os.path.exists(favicon_path), "Favicon logo has been removed")
# Resized images have not been created yet
self.assertFalse(os.path.exists(os.path.join(webodm_settings.MEDIA_ROOT, settings.app_logo_36.name)), "Resized logo does not exist")
# When we access its URL, it gets created (lazy)
print("Access: " + settings.app_logo_36.url)
self.assertTrue(os.path.exists(os.path.join(webodm_settings.MEDIA_ROOT, settings.app_logo_36.name)), "Resized logo does not exist")
c = Client()