from django.template import Context, Template, Variable, VariableDoesNotExist from django.template.base import DebugLexer, Lexer, TokenType from django.test import SimpleTestCase from django.utils.translation import gettext_lazy class LexerTestMixin: template_string = ( 'text\n' '{% if test %}{{ varvalue }}{% endif %}' '{#comment {{not a var}} %{not a block}% #}' 'end text' ) expected_token_tuples = [ # (token_type, contents, lineno, position) (TokenType.TEXT, 'text\n', 1, (0, 5)), (TokenType.BLOCK, 'if test', 2, (5, 18)), (TokenType.VAR, 'varvalue', 2, (18, 32)), (TokenType.BLOCK, 'endif', 2, (32, 43)), (TokenType.COMMENT, 'comment {{not a var}} %{not a block}%', 2, (43, 85)), (TokenType.TEXT, 'end text', 2, (85, 93)), ] def test_tokenize(self): tokens = self.lexer_class(self.template_string).tokenize() token_tuples = [(t.token_type, t.contents, t.lineno, t.position) for t in tokens] self.assertEqual(token_tuples, self.make_expected()) def make_expected(self): raise NotImplementedError('This method must be implemented by a subclass.') class LexerTests(LexerTestMixin, SimpleTestCase): lexer_class = Lexer def make_expected(self): # The non-debug lexer does not record position. return [t[:-1] + (None,) for t in self.expected_token_tuples] class DebugLexerTests(LexerTestMixin, SimpleTestCase): lexer_class = DebugLexer def make_expected(self): return self.expected_token_tuples class TemplateTests(SimpleTestCase): def test_lazy_template_string(self): template_string = gettext_lazy('lazy string') self.assertEqual(Template(template_string).render(Context()), template_string) def test_repr(self): template = Template( '
\n' '{% if test %}