From a203d6bb2f399706daff9f16deb2c87b9ef1c16b Mon Sep 17 00:00:00 2001 From: Lukasz Balcerzak Date: Sun, 18 Sep 2011 12:54:21 +0200 Subject: [PATCH] Added tests for jinja2 extension after tests refactor (#92) --- compressor/contrib/jinja2ext.py | 17 ++-- tests/tests/__init__.py | 1 + tests/tests/jinja2ext.py | 133 ++++++++++++++++++++++++++++++++ 3 files changed, 146 insertions(+), 5 deletions(-) create mode 100644 tests/tests/jinja2ext.py diff --git a/compressor/contrib/jinja2ext.py b/compressor/contrib/jinja2ext.py index ffd3f53..a0ddbac 100644 --- a/compressor/contrib/jinja2ext.py +++ b/compressor/contrib/jinja2ext.py @@ -4,7 +4,7 @@ from jinja2.exceptions import TemplateSyntaxError from django.core.exceptions import ImproperlyConfigured from compressor.conf import settings from compressor.utils import get_class -from compressor.templatetags.compress import COMPRESSORS, OUTPUT_FILE +from compressor.templatetags.compress import OUTPUT_FILE from compressor.cache import (cache_get, cache_set, get_templatetag_cachekey) @@ -13,6 +13,13 @@ class CompressorExtension(Extension): tags = set(['compress']) + @property + def compressors(self): + return { + 'js': settings.COMPRESS_JS_COMPRESSOR, + 'css': settings.COMPRESS_CSS_COMPRESSOR, + } + def parse(self, parser): lineno = parser.stream.next().lineno kindarg = parser.parse_expression() @@ -20,9 +27,9 @@ class CompressorExtension(Extension): if isinstance(kindarg, nodes.Name): kindarg = nodes.Const(kindarg.name) args = [kindarg] - if args[0].value not in COMPRESSORS: - raise TemplateSyntaxError('compress kind may be "css" or "js"', - lineno) + if args[0].value not in self.compressors: + raise TemplateSyntaxError('compress kind may be one of: %s' + % (', '.join(self.compressors.keys())), lineno) if parser.stream.skip_if('comma'): modearg = parser.parse_expression() # Allow mode to be defined as jinja2 name node @@ -37,7 +44,7 @@ class CompressorExtension(Extension): def _compress(self, kind, mode, caller): mode = mode or OUTPUT_FILE - Compressor = get_class(COMPRESSORS.get(kind), + Compressor = get_class(self.compressors.get(kind), exception=ImproperlyConfigured) original_content = caller() compressor = Compressor(original_content) diff --git a/tests/tests/__init__.py b/tests/tests/__init__.py index b77ee0a..d800c50 100644 --- a/tests/tests/__init__.py +++ b/tests/tests/__init__.py @@ -1,5 +1,6 @@ from .base import CompressorTestCase, CssMediaTestCase, VerboseTestCase, CacheBackendTestCase from .filters import CssTidyTestCase, PrecompilerTestCase, CssMinTestCase, CssAbsolutizingTestCase, CssDataUriTestCase +from .jinja2ext import TestJinja2CompressorExtension from .offline import OfflineGenerationTestCase from .parsers import LxmlParserTests, Html5LibParserTests, BeautifulSoupParserTests, HtmlParserTests from .signals import PostCompressSignalTestCase diff --git a/tests/tests/jinja2ext.py b/tests/tests/jinja2ext.py new file mode 100644 index 0000000..2abd5a1 --- /dev/null +++ b/tests/tests/jinja2ext.py @@ -0,0 +1,133 @@ +from django.test import TestCase +from compressor.conf import settings +from unittest2 import skipIf +from .base import css_tag + + +try: + import jinja2 +except ImportError: + jinja2 = None + + +class TestJinja2CompressorExtension(TestCase): + """ + Test case for jinja2 extension. + + .. note:: + At tests we need to make some extra care about whitespace. Please note + that we use jinja2 specific controls (*minus* character at block's + beginning or end). For more information see jinja2 documentation. + """ + + def assertStrippedEqual(self, result, expected): + self.assertEqual(result.strip(), expected.strip(), "%r != %r" % ( + result.strip(), expected.strip())) + + def setUp(self): + from compressor.contrib.jinja2ext import CompressorExtension + self.env = jinja2.Environment(extensions=[CompressorExtension]) + + def test_error_raised_if_no_arguments_given(self): + with self.assertRaises(jinja2.exceptions.TemplateSyntaxError): + self.env.from_string('{% compress %}Foobar{% endcompress %}') + + def test_error_raised_if_wrong_kind_given(self): + with self.assertRaises(jinja2.exceptions.TemplateSyntaxError): + self.env.from_string('{% compress foo %}Foobar{% endcompress %}' + ).render() + + def test_error_raised_if_wrong_mode_given(self): + with self.assertRaises(jinja2.exceptions.TemplateSyntaxError): + self.env.from_string('{% compress css foo %}Foobar{% endcompress %}' + ).render() + + def test_compress_is_disabled(self): + org_COMPRESS_ENABLED = settings.COMPRESS_ENABLED + settings.COMPRESS_ENABLED = False + tag_body = '\n'.join([ + '', + '', + '', + ]) + template_string = '{% compress css %}' + tag_body + '{% endcompress %}' + template = self.env.from_string(template_string) + self.assertEqual(tag_body, template.render()) + settings.COMPRESS_ENABLED = org_COMPRESS_ENABLED + + def test_empty_tag(self): + template = self.env.from_string(u"""{% compress js %}{% block js %} + {% endblock %}{% endcompress %}""") + context = {'MEDIA_URL': settings.COMPRESS_URL } + self.assertEqual(u'', template.render(context)) + + def test_css_tag(self): + template = self.env.from_string(u"""{% compress css -%} + + + + {%- endcompress %}""") + context = {'MEDIA_URL': settings.COMPRESS_URL } + out = css_tag("/media/CACHE/css/e41ba2cc6982.css") + self.assertEqual(out, template.render(context)) + + def test_nonascii_css_tag(self): + template = self.env.from_string(u"""{% compress css -%} + + + {%- endcompress %}""") + context = {'MEDIA_URL': settings.COMPRESS_URL } + out = css_tag("/media/CACHE/css/799f6defe43c.css") + self.assertEqual(out, template.render(context)) + + def test_js_tag(self): + template = self.env.from_string(u"""{% compress js -%} + + + {%- endcompress %}""") + context = {'MEDIA_URL': settings.COMPRESS_URL } + out = u'' + self.assertEqual(out, template.render(context)) + + def test_nonascii_js_tag(self): + template = self.env.from_string(u"""{% compress js -%} + + + {%- endcompress %}""") + context = {'MEDIA_URL': settings.COMPRESS_URL } + out = u'' + self.assertEqual(out, template.render(context)) + + def test_nonascii_latin1_js_tag(self): + template = self.env.from_string(u"""{% compress js -%} + + + {%- endcompress %}""") + context = {'MEDIA_URL': settings.COMPRESS_URL } + out = u'' + self.assertEqual(out, template.render(context)) + + def test_css_inline(self): + template = self.env.from_string(u"""{% compress css, inline -%} + + + {%- endcompress %}""") + context = {'MEDIA_URL': settings.COMPRESS_URL } + out = '\n'.join([ + '', + ]) + self.assertEqual(out, template.render(context)) + + def test_js_inline(self): + template = self.env.from_string(u"""{% compress js, inline -%} + + + {%- endcompress %}""") + context = {'MEDIA_URL': settings.COMPRESS_URL } + out = '' + self.assertEqual(out, template.render(context)) + +TestJinja2CompressorExtension = skipIf(jinja2 is None, 'jinja2 not found')( + TestJinja2CompressorExtension) +