143 lines
5.3 KiB
Python
143 lines
5.3 KiB
Python
from __future__ import with_statement
|
|
import os
|
|
|
|
try:
|
|
from cStringIO import StringIO
|
|
except ImportError:
|
|
from StringIO import StringIO
|
|
|
|
from django.template import Template, Context
|
|
from django.test import TestCase
|
|
|
|
from compressor.conf import settings
|
|
from compressor.exceptions import OfflineGenerationError
|
|
from compressor.management.commands.compress import Command as CompressCommand
|
|
from compressor.storage import default_storage
|
|
|
|
|
|
class OfflineTestCaseMixin(object):
|
|
template_name = "test_compressor_offline.html"
|
|
verbosity = 0
|
|
# Change this for each test class
|
|
templates_dir = ""
|
|
expected_hash = ""
|
|
|
|
def setUp(self):
|
|
self._old_compress = settings.COMPRESS_ENABLED
|
|
self._old_compress_offline = settings.COMPRESS_OFFLINE
|
|
self._old_template_dirs = settings.TEMPLATE_DIRS
|
|
self._old_offline_context = settings.COMPRESS_OFFLINE_CONTEXT
|
|
self._old_template_loaders = settings.TEMPLATE_LOADERS
|
|
self.log = StringIO()
|
|
|
|
# Force template dirs, because it enables us to force compress to
|
|
# consider only a specific directory (helps us make true,
|
|
# independant unit tests).
|
|
settings.TEMPLATE_DIRS = (
|
|
os.path.join(settings.TEMPLATE_DIRS[0], self.templates_dir),
|
|
)
|
|
# Enable offline compress
|
|
settings.COMPRESS_ENABLED = True
|
|
settings.COMPRESS_OFFLINE = True
|
|
self.template_path = os.path.join(settings.TEMPLATE_DIRS[0], self.template_name)
|
|
self.template_file = open(self.template_path)
|
|
self.template = Template(self.template_file.read().decode(settings.FILE_CHARSET))
|
|
|
|
def tearDown(self):
|
|
settings.COMPRESS_ENABLED = self._old_compress
|
|
settings.COMPRESS_OFFLINE = self._old_compress_offline
|
|
settings.TEMPLATE_DIRS = self._old_template_dirs
|
|
settings.TEMPLATE_LOADERS = self._old_template_loaders
|
|
self.template_file.close()
|
|
manifest_path = os.path.join('CACHE', 'manifest.json')
|
|
if default_storage.exists(manifest_path):
|
|
default_storage.delete(manifest_path)
|
|
|
|
def test_offline(self):
|
|
count, result = CompressCommand().compress(log=self.log, verbosity=self.verbosity)
|
|
self.assertEqual(1, count)
|
|
self.assertEqual([
|
|
u'<script type="text/javascript" src="/media/CACHE/js/%s.js"></script>' % (self.expected_hash, ),
|
|
], result)
|
|
rendered_template = self.template.render(Context(settings.COMPRESS_OFFLINE_CONTEXT))
|
|
self.assertEqual(rendered_template, "".join(result) + "\n")
|
|
|
|
|
|
class OfflineGenerationBlockSuperTestCase(OfflineTestCaseMixin, TestCase):
|
|
templates_dir = "test_block_super"
|
|
expected_hash = "7c02d201f69d"
|
|
|
|
|
|
class OfflineGenerationConditionTestCase(OfflineTestCaseMixin, TestCase):
|
|
templates_dir = "test_condition"
|
|
expected_hash = "4e3758d50224"
|
|
|
|
def setUp(self):
|
|
self.old_offline_context = settings.COMPRESS_OFFLINE_CONTEXT
|
|
settings.COMPRESS_OFFLINE_CONTEXT = {
|
|
'condition': 'red',
|
|
}
|
|
super(OfflineGenerationConditionTestCase, self).setUp()
|
|
|
|
def tearDown(self):
|
|
self.COMPRESS_OFFLINE_CONTEXT = self.old_offline_context
|
|
super(OfflineGenerationConditionTestCase, self).tearDown()
|
|
|
|
|
|
class OfflineGenerationTemplateTagTestCase(OfflineTestCaseMixin, TestCase):
|
|
templates_dir = "test_templatetag"
|
|
expected_hash = "a27e1d3a619a"
|
|
|
|
|
|
class OfflineGenerationTestCaseWithContext(OfflineTestCaseMixin, TestCase):
|
|
templates_dir = "test_with_context"
|
|
expected_hash = "5838e2fd66af"
|
|
|
|
def setUp(self):
|
|
self.old_offline_context = settings.COMPRESS_OFFLINE_CONTEXT
|
|
settings.COMPRESS_OFFLINE_CONTEXT = {
|
|
'content': 'OK!',
|
|
}
|
|
super(OfflineGenerationTestCaseWithContext, self).setUp()
|
|
|
|
def tearDown(self):
|
|
self.COMPRESS_OFFLINE_CONTEXT = self.old_offline_context
|
|
super(OfflineGenerationTestCaseWithContext, self).tearDown()
|
|
|
|
|
|
class OfflineGenerationTestCaseErrors(OfflineTestCaseMixin, TestCase):
|
|
templates_dir = "test_error_handling"
|
|
expected_hash = "cd8870829421"
|
|
|
|
|
|
class OfflineGenerationTestCase(OfflineTestCaseMixin, TestCase):
|
|
templates_dir = "basic"
|
|
expected_hash = "f5e179b8eca4"
|
|
|
|
def test_rendering_without_compressing_raises_exception(self):
|
|
self.assertRaises(OfflineGenerationError,
|
|
self.template.render, Context({}))
|
|
|
|
def test_requires_model_validation(self):
|
|
self.assertFalse(CompressCommand.requires_model_validation)
|
|
|
|
def test_get_loaders(self):
|
|
old_loaders = settings.TEMPLATE_LOADERS
|
|
settings.TEMPLATE_LOADERS = (
|
|
('django.template.loaders.cached.Loader', (
|
|
'django.template.loaders.filesystem.Loader',
|
|
'django.template.loaders.app_directories.Loader',
|
|
)),
|
|
)
|
|
try:
|
|
from django.template.loaders.filesystem import Loader as FileSystemLoader
|
|
from django.template.loaders.app_directories import Loader as AppDirectoriesLoader
|
|
except ImportError:
|
|
pass
|
|
else:
|
|
loaders = CompressCommand().get_loaders()
|
|
self.assertTrue(isinstance(loaders[0], FileSystemLoader))
|
|
self.assertTrue(isinstance(loaders[1], AppDirectoriesLoader))
|
|
finally:
|
|
settings.TEMPLATE_LOADERS = old_loaders
|