import os, re import gzip from django.template import Template, Context from django.test import TestCase from compressor import CssCompressor, JsCompressor from compressor.conf import settings from compressor.storage import CompressorFileStorage from django.conf import settings as django_settings from BeautifulSoup import BeautifulSoup class CompressorTestCase(TestCase): def setUp(self): settings.COMPRESS = True self.css = """ """ self.cssNode = CssCompressor(self.css) self.js = """ """ self.jsNode = JsCompressor(self.js) def test_css_split(self): out = [ ('file', os.path.join(settings.MEDIA_ROOT, u'css/one.css'), ''), ('hunk', u'p { border:5px solid green;}', ''), ('file', os.path.join(settings.MEDIA_ROOT, u'css/two.css'), ''), ] split = self.cssNode.split_contents() split = [(x[0], x[1], str(x[2])) for x in split] self.assertEqual(out, split) def test_css_hunks(self): out = ['body { background:#990; }', u'p { border:5px solid green;}', 'body { color:#fff; }'] self.assertEqual(out, self.cssNode.hunks) def test_css_output(self): out = u'body { background:#990; }\np { border:5px solid green;}\nbody { color:#fff; }' self.assertEqual(out, self.cssNode.combined) def test_css_mtimes(self): is_date = re.compile(r'^\d{10}\.\d$') for date in self.cssNode.mtimes: self.assert_(is_date.match(str(date)), "mtimes is returning something that doesn't look like a date") def test_css_return_if_off(self): settings.COMPRESS = False self.assertEqual(self.css, self.cssNode.output()) def test_cachekey(self): is_cachekey = re.compile(r'django_compressor\.\w{12}') self.assert_(is_cachekey.match(self.cssNode.cachekey), "cachekey is returning something that doesn't look like r'django_compressor\.\w{12}'") def test_css_hash(self): self.assertEqual('f7c661b7a124', self.cssNode.hash) def test_css_return_if_on(self): output = u'' self.assertEqual(output, self.cssNode.output().strip()) def test_js_split(self): out = [('file', os.path.join(settings.MEDIA_ROOT, u'js/one.js'), ''), ('hunk', u'obj.value = "value";', '') ] split = self.jsNode.split_contents() split = [(x[0], x[1], str(x[2])) for x in split] self.assertEqual(out, split) def test_js_hunks(self): out = ['obj = {};', u'obj.value = "value";'] self.assertEqual(out, self.jsNode.hunks) def test_js_concat(self): out = u'obj = {};\nobj.value = "value";' self.assertEqual(out, self.jsNode.concat()) def test_js_output(self): out = u'obj={};obj.value="value";' self.assertEqual(out, self.jsNode.combined) def test_js_return_if_off(self): settings.COMPRESS = False self.assertEqual(self.js, self.jsNode.output()) def test_js_return_if_on(self): output = u'' self.assertEqual(output, self.jsNode.output()) class CssAbsolutizingTestCase(TestCase): def setUp(self): settings.COMPRESS = True settings.MEDIA_URL = '/media/' self.css = """ """ self.cssNode = CssCompressor(self.css) def test_css_absolute_filter(self): from compressor.filters.css_default import CssAbsoluteFilter filename = os.path.join(settings.MEDIA_ROOT, 'css/url/test.css') content = "p { background: url('../../images/image.gif') }" output = "p { background: url('%simages/image.gif') }" % settings.MEDIA_URL filter = CssAbsoluteFilter(content) self.assertEqual(output, filter.input(filename=filename)) settings.MEDIA_URL = 'http://media.example.com/' filename = os.path.join(settings.MEDIA_ROOT, 'css/url/test.css') output = "p { background: url('%simages/image.gif') }" % settings.MEDIA_URL self.assertEqual(output, filter.input(filename=filename)) def test_css_absolute_filter_https(self): from compressor.filters.css_default import CssAbsoluteFilter filename = os.path.join(settings.MEDIA_ROOT, 'css/url/test.css') content = "p { background: url('../../images/image.gif') }" output = "p { background: url('%simages/image.gif') }" % settings.MEDIA_URL filter = CssAbsoluteFilter(content) self.assertEqual(output, filter.input(filename=filename)) settings.MEDIA_URL = 'https://media.example.com/' filename = os.path.join(settings.MEDIA_ROOT, 'css/url/test.css') output = "p { background: url('%simages/image.gif') }" % settings.MEDIA_URL self.assertEqual(output, filter.input(filename=filename)) def test_css_hunks(self): out = [u"p { background: url('/media/images/test.png'); }\np { background: url('/media/images/test.png'); }\np { background: url('/media/images/test.png'); }\np { background: url('/media/images/test.png'); }\n", u"p { background: url('/media/images/test.png'); }\np { background: url('/media/images/test.png'); }\np { background: url('/media/images/test.png'); }\np { background: url('/media/images/test.png'); }\n", ] self.assertEqual(out, self.cssNode.hunks) class CssMediaTestCase(TestCase): def setUp(self): self.css = """ """ self.cssNode = CssCompressor(self.css) def test_css_output(self): links = BeautifulSoup(self.cssNode.output()).findAll('link') media = set([u'screen', u'print', u'all', None]) self.assertEqual(len(links), 4) self.assertEqual(media, set([l.get('media', None) for l in links])) def render(template_string, context_dict=None): """A shortcut for testing template output.""" if context_dict is None: context_dict = {} c = Context(context_dict) t = Template(template_string) return t.render(c).strip() class TemplatetagTestCase(TestCase): def setUp(self): settings.COMPRESS = True def test_css_tag(self): template = u"""{% load compress %}{% compress css %} {% endcompress %} """ context = { 'MEDIA_URL': settings.MEDIA_URL } out = u'' self.assertEqual(out, render(template, context)) def test_nonascii_css_tag(self): template = u"""{% load compress %}{% compress css %} {% endcompress %} """ context = { 'MEDIA_URL': settings.MEDIA_URL } out = '' self.assertEqual(out, render(template, context)) def test_js_tag(self): template = u"""{% load compress %}{% compress js %} {% endcompress %} """ context = { 'MEDIA_URL': settings.MEDIA_URL } out = u'' self.assertEqual(out, render(template, context)) def test_nonascii_js_tag(self): template = u"""{% load compress %}{% compress js %} {% endcompress %} """ context = { 'MEDIA_URL': settings.MEDIA_URL } out = u'' self.assertEqual(out, render(template, context)) class TestStorage(CompressorFileStorage): """ Test compressor storage that gzips storage files """ def url(self, name): return u'%s.gz' % super(TestStorage, self).url(name) def save(self, filename, content): filename = super(TestStorage, self).save(filename, content) out = gzip.open(u'%s.gz' % self.path(filename), 'wb') out.writelines(open(self.path(filename), 'rb')) out.close() class StorageTestCase(TestCase): def setUp(self): self._storage = settings.STORAGE settings.STORAGE = 'core.tests.TestStorage' settings.COMPRESS = True def tearDown(self): settings.STORAGE = self._storage def test_css_tag_with_storage(self): template = u"""{% load compress %}{% compress css %} {% endcompress %} """ context = { 'MEDIA_URL': settings.MEDIA_URL } out = u'' self.assertEqual(out, render(template, context))