test_custom.py 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382
  1. from __future__ import unicode_literals
  2. from unittest import TestCase
  3. from django import template
  4. from django.test import ignore_warnings
  5. from django.utils import six
  6. from django.utils.deprecation import RemovedInDjango20Warning
  7. from .templatetags import custom
  8. class CustomFilterTests(TestCase):
  9. def test_filter(self):
  10. t = template.Template("{% load custom %}{{ string|trim:5 }}")
  11. self.assertEqual(
  12. t.render(template.Context({"string": "abcdefghijklmnopqrstuvwxyz"})),
  13. "abcde"
  14. )
  15. class CustomTagTests(TestCase):
  16. def verify_tag(self, tag, name):
  17. self.assertEqual(tag.__name__, name)
  18. self.assertEqual(tag.__doc__, 'Expected %s __doc__' % name)
  19. self.assertEqual(tag.__dict__['anything'], 'Expected %s __dict__' % name)
  20. def test_simple_tags(self):
  21. c = template.Context({'value': 42})
  22. t = template.Template('{% load custom %}{% no_params %}')
  23. self.assertEqual(t.render(c), 'no_params - Expected result')
  24. t = template.Template('{% load custom %}{% one_param 37 %}')
  25. self.assertEqual(t.render(c), 'one_param - Expected result: 37')
  26. t = template.Template('{% load custom %}{% explicit_no_context 37 %}')
  27. self.assertEqual(t.render(c), 'explicit_no_context - Expected result: 37')
  28. t = template.Template('{% load custom %}{% no_params_with_context %}')
  29. self.assertEqual(t.render(c), 'no_params_with_context - Expected result (context value: 42)')
  30. t = template.Template('{% load custom %}{% params_and_context 37 %}')
  31. self.assertEqual(t.render(c), 'params_and_context - Expected result (context value: 42): 37')
  32. t = template.Template('{% load custom %}{% simple_two_params 37 42 %}')
  33. self.assertEqual(t.render(c), 'simple_two_params - Expected result: 37, 42')
  34. t = template.Template('{% load custom %}{% simple_one_default 37 %}')
  35. self.assertEqual(t.render(c), 'simple_one_default - Expected result: 37, hi')
  36. t = template.Template('{% load custom %}{% simple_one_default 37 two="hello" %}')
  37. self.assertEqual(t.render(c), 'simple_one_default - Expected result: 37, hello')
  38. t = template.Template('{% load custom %}{% simple_one_default one=99 two="hello" %}')
  39. self.assertEqual(t.render(c), 'simple_one_default - Expected result: 99, hello')
  40. six.assertRaisesRegex(self, template.TemplateSyntaxError,
  41. "'simple_one_default' received unexpected keyword argument 'three'",
  42. template.Template, '{% load custom %}{% simple_one_default 99 two="hello" three="foo" %}')
  43. t = template.Template('{% load custom %}{% simple_one_default 37 42 %}')
  44. self.assertEqual(t.render(c), 'simple_one_default - Expected result: 37, 42')
  45. t = template.Template('{% load custom %}{% simple_unlimited_args 37 %}')
  46. self.assertEqual(t.render(c), 'simple_unlimited_args - Expected result: 37, hi')
  47. t = template.Template('{% load custom %}{% simple_unlimited_args 37 42 56 89 %}')
  48. self.assertEqual(t.render(c), 'simple_unlimited_args - Expected result: 37, 42, 56, 89')
  49. t = template.Template('{% load custom %}{% simple_only_unlimited_args %}')
  50. self.assertEqual(t.render(c), 'simple_only_unlimited_args - Expected result: ')
  51. t = template.Template('{% load custom %}{% simple_only_unlimited_args 37 42 56 89 %}')
  52. self.assertEqual(t.render(c), 'simple_only_unlimited_args - Expected result: 37, 42, 56, 89')
  53. six.assertRaisesRegex(self, template.TemplateSyntaxError,
  54. "'simple_two_params' received too many positional arguments",
  55. template.Template, '{% load custom %}{% simple_two_params 37 42 56 %}')
  56. six.assertRaisesRegex(self, template.TemplateSyntaxError,
  57. "'simple_one_default' received too many positional arguments",
  58. template.Template, '{% load custom %}{% simple_one_default 37 42 56 %}')
  59. t = template.Template('{% load custom %}{% simple_unlimited_args_kwargs 37 40|add:2 56 eggs="scrambled" four=1|add:3 %}')
  60. self.assertEqual(t.render(c), 'simple_unlimited_args_kwargs - Expected result: 37, 42, 56 / eggs=scrambled, four=4')
  61. six.assertRaisesRegex(self, template.TemplateSyntaxError,
  62. "'simple_unlimited_args_kwargs' received some positional argument\(s\) after some keyword argument\(s\)",
  63. template.Template, '{% load custom %}{% simple_unlimited_args_kwargs 37 40|add:2 eggs="scrambled" 56 four=1|add:3 %}')
  64. six.assertRaisesRegex(self, template.TemplateSyntaxError,
  65. "'simple_unlimited_args_kwargs' received multiple values for keyword argument 'eggs'",
  66. template.Template, '{% load custom %}{% simple_unlimited_args_kwargs 37 eggs="scrambled" eggs="scrambled" %}')
  67. def test_simple_tag_registration(self):
  68. # Test that the decorators preserve the decorated function's docstring, name and attributes.
  69. self.verify_tag(custom.no_params, 'no_params')
  70. self.verify_tag(custom.one_param, 'one_param')
  71. self.verify_tag(custom.explicit_no_context, 'explicit_no_context')
  72. self.verify_tag(custom.no_params_with_context, 'no_params_with_context')
  73. self.verify_tag(custom.params_and_context, 'params_and_context')
  74. self.verify_tag(custom.simple_unlimited_args_kwargs, 'simple_unlimited_args_kwargs')
  75. self.verify_tag(custom.simple_tag_without_context_parameter, 'simple_tag_without_context_parameter')
  76. def test_simple_tag_missing_context(self):
  77. # The 'context' parameter must be present when takes_context is True
  78. six.assertRaisesRegex(self, template.TemplateSyntaxError,
  79. "'simple_tag_without_context_parameter' is decorated with takes_context=True so it must have a first argument of 'context'",
  80. template.Template, '{% load custom %}{% simple_tag_without_context_parameter 123 %}')
  81. def test_inclusion_tags(self):
  82. c = template.Context({'value': 42})
  83. t = template.Template('{% load custom %}{% inclusion_no_params %}')
  84. self.assertEqual(t.render(c), 'inclusion_no_params - Expected result\n')
  85. t = template.Template('{% load custom %}{% inclusion_one_param 37 %}')
  86. self.assertEqual(t.render(c), 'inclusion_one_param - Expected result: 37\n')
  87. t = template.Template('{% load custom %}{% inclusion_explicit_no_context 37 %}')
  88. self.assertEqual(t.render(c), 'inclusion_explicit_no_context - Expected result: 37\n')
  89. t = template.Template('{% load custom %}{% inclusion_no_params_with_context %}')
  90. self.assertEqual(t.render(c), 'inclusion_no_params_with_context - Expected result (context value: 42)\n')
  91. t = template.Template('{% load custom %}{% inclusion_params_and_context 37 %}')
  92. self.assertEqual(t.render(c), 'inclusion_params_and_context - Expected result (context value: 42): 37\n')
  93. t = template.Template('{% load custom %}{% inclusion_two_params 37 42 %}')
  94. self.assertEqual(t.render(c), 'inclusion_two_params - Expected result: 37, 42\n')
  95. t = template.Template('{% load custom %}{% inclusion_one_default 37 %}')
  96. self.assertEqual(t.render(c), 'inclusion_one_default - Expected result: 37, hi\n')
  97. t = template.Template('{% load custom %}{% inclusion_one_default 37 two="hello" %}')
  98. self.assertEqual(t.render(c), 'inclusion_one_default - Expected result: 37, hello\n')
  99. t = template.Template('{% load custom %}{% inclusion_one_default one=99 two="hello" %}')
  100. self.assertEqual(t.render(c), 'inclusion_one_default - Expected result: 99, hello\n')
  101. six.assertRaisesRegex(self, template.TemplateSyntaxError,
  102. "'inclusion_one_default' received unexpected keyword argument 'three'",
  103. template.Template, '{% load custom %}{% inclusion_one_default 99 two="hello" three="foo" %}')
  104. t = template.Template('{% load custom %}{% inclusion_one_default 37 42 %}')
  105. self.assertEqual(t.render(c), 'inclusion_one_default - Expected result: 37, 42\n')
  106. t = template.Template('{% load custom %}{% inclusion_unlimited_args 37 %}')
  107. self.assertEqual(t.render(c), 'inclusion_unlimited_args - Expected result: 37, hi\n')
  108. t = template.Template('{% load custom %}{% inclusion_unlimited_args 37 42 56 89 %}')
  109. self.assertEqual(t.render(c), 'inclusion_unlimited_args - Expected result: 37, 42, 56, 89\n')
  110. t = template.Template('{% load custom %}{% inclusion_only_unlimited_args %}')
  111. self.assertEqual(t.render(c), 'inclusion_only_unlimited_args - Expected result: \n')
  112. t = template.Template('{% load custom %}{% inclusion_only_unlimited_args 37 42 56 89 %}')
  113. self.assertEqual(t.render(c), 'inclusion_only_unlimited_args - Expected result: 37, 42, 56, 89\n')
  114. six.assertRaisesRegex(self, template.TemplateSyntaxError,
  115. "'inclusion_two_params' received too many positional arguments",
  116. template.Template, '{% load custom %}{% inclusion_two_params 37 42 56 %}')
  117. six.assertRaisesRegex(self, template.TemplateSyntaxError,
  118. "'inclusion_one_default' received too many positional arguments",
  119. template.Template, '{% load custom %}{% inclusion_one_default 37 42 56 %}')
  120. six.assertRaisesRegex(self, template.TemplateSyntaxError,
  121. "'inclusion_one_default' did not receive value\(s\) for the argument\(s\): 'one'",
  122. template.Template, '{% load custom %}{% inclusion_one_default %}')
  123. six.assertRaisesRegex(self, template.TemplateSyntaxError,
  124. "'inclusion_unlimited_args' did not receive value\(s\) for the argument\(s\): 'one'",
  125. template.Template, '{% load custom %}{% inclusion_unlimited_args %}')
  126. t = template.Template('{% load custom %}{% inclusion_unlimited_args_kwargs 37 40|add:2 56 eggs="scrambled" four=1|add:3 %}')
  127. self.assertEqual(t.render(c), 'inclusion_unlimited_args_kwargs - Expected result: 37, 42, 56 / eggs=scrambled, four=4\n')
  128. six.assertRaisesRegex(self, template.TemplateSyntaxError,
  129. "'inclusion_unlimited_args_kwargs' received some positional argument\(s\) after some keyword argument\(s\)",
  130. template.Template, '{% load custom %}{% inclusion_unlimited_args_kwargs 37 40|add:2 eggs="scrambled" 56 four=1|add:3 %}')
  131. six.assertRaisesRegex(self, template.TemplateSyntaxError,
  132. "'inclusion_unlimited_args_kwargs' received multiple values for keyword argument 'eggs'",
  133. template.Template, '{% load custom %}{% inclusion_unlimited_args_kwargs 37 eggs="scrambled" eggs="scrambled" %}')
  134. def test_include_tag_missing_context(self):
  135. # The 'context' parameter must be present when takes_context is True
  136. six.assertRaisesRegex(self, template.TemplateSyntaxError,
  137. "'inclusion_tag_without_context_parameter' is decorated with takes_context=True so it must have a first argument of 'context'",
  138. template.Template, '{% load custom %}{% inclusion_tag_without_context_parameter 123 %}')
  139. def test_inclusion_tags_from_template(self):
  140. c = template.Context({'value': 42})
  141. t = template.Template('{% load custom %}{% inclusion_no_params_from_template %}')
  142. self.assertEqual(t.render(c), 'inclusion_no_params_from_template - Expected result\n')
  143. t = template.Template('{% load custom %}{% inclusion_one_param_from_template 37 %}')
  144. self.assertEqual(t.render(c), 'inclusion_one_param_from_template - Expected result: 37\n')
  145. t = template.Template('{% load custom %}{% inclusion_explicit_no_context_from_template 37 %}')
  146. self.assertEqual(t.render(c), 'inclusion_explicit_no_context_from_template - Expected result: 37\n')
  147. t = template.Template('{% load custom %}{% inclusion_no_params_with_context_from_template %}')
  148. self.assertEqual(t.render(c), 'inclusion_no_params_with_context_from_template - Expected result (context value: 42)\n')
  149. t = template.Template('{% load custom %}{% inclusion_params_and_context_from_template 37 %}')
  150. self.assertEqual(t.render(c), 'inclusion_params_and_context_from_template - Expected result (context value: 42): 37\n')
  151. t = template.Template('{% load custom %}{% inclusion_two_params_from_template 37 42 %}')
  152. self.assertEqual(t.render(c), 'inclusion_two_params_from_template - Expected result: 37, 42\n')
  153. t = template.Template('{% load custom %}{% inclusion_one_default_from_template 37 %}')
  154. self.assertEqual(t.render(c), 'inclusion_one_default_from_template - Expected result: 37, hi\n')
  155. t = template.Template('{% load custom %}{% inclusion_one_default_from_template 37 42 %}')
  156. self.assertEqual(t.render(c), 'inclusion_one_default_from_template - Expected result: 37, 42\n')
  157. t = template.Template('{% load custom %}{% inclusion_unlimited_args_from_template 37 %}')
  158. self.assertEqual(t.render(c), 'inclusion_unlimited_args_from_template - Expected result: 37, hi\n')
  159. t = template.Template('{% load custom %}{% inclusion_unlimited_args_from_template 37 42 56 89 %}')
  160. self.assertEqual(t.render(c), 'inclusion_unlimited_args_from_template - Expected result: 37, 42, 56, 89\n')
  161. t = template.Template('{% load custom %}{% inclusion_only_unlimited_args_from_template %}')
  162. self.assertEqual(t.render(c), 'inclusion_only_unlimited_args_from_template - Expected result: \n')
  163. t = template.Template('{% load custom %}{% inclusion_only_unlimited_args_from_template 37 42 56 89 %}')
  164. self.assertEqual(t.render(c), 'inclusion_only_unlimited_args_from_template - Expected result: 37, 42, 56, 89\n')
  165. def test_inclusion_tag_registration(self):
  166. # Test that the decorators preserve the decorated function's docstring, name and attributes.
  167. self.verify_tag(custom.inclusion_no_params, 'inclusion_no_params')
  168. self.verify_tag(custom.inclusion_one_param, 'inclusion_one_param')
  169. self.verify_tag(custom.inclusion_explicit_no_context, 'inclusion_explicit_no_context')
  170. self.verify_tag(custom.inclusion_no_params_with_context, 'inclusion_no_params_with_context')
  171. self.verify_tag(custom.inclusion_params_and_context, 'inclusion_params_and_context')
  172. self.verify_tag(custom.inclusion_two_params, 'inclusion_two_params')
  173. self.verify_tag(custom.inclusion_one_default, 'inclusion_one_default')
  174. self.verify_tag(custom.inclusion_unlimited_args, 'inclusion_unlimited_args')
  175. self.verify_tag(custom.inclusion_only_unlimited_args, 'inclusion_only_unlimited_args')
  176. self.verify_tag(custom.inclusion_tag_without_context_parameter, 'inclusion_tag_without_context_parameter')
  177. self.verify_tag(custom.inclusion_tag_use_l10n, 'inclusion_tag_use_l10n')
  178. self.verify_tag(custom.inclusion_tag_current_app, 'inclusion_tag_current_app')
  179. self.verify_tag(custom.inclusion_unlimited_args_kwargs, 'inclusion_unlimited_args_kwargs')
  180. @ignore_warnings(category=RemovedInDjango20Warning)
  181. def test_15070_current_app(self):
  182. """
  183. Test that inclusion tag passes down `current_app` of context to the
  184. Context of the included/rendered template as well.
  185. """
  186. c = template.Context({})
  187. t = template.Template('{% load custom %}{% inclusion_tag_current_app %}')
  188. self.assertEqual(t.render(c).strip(), 'None')
  189. # That part produces the deprecation warning
  190. c = template.Context({}, current_app='advanced')
  191. self.assertEqual(t.render(c).strip(), 'advanced')
  192. def test_15070_use_l10n(self):
  193. """
  194. Test that inclusion tag passes down `use_l10n` of context to the
  195. Context of the included/rendered template as well.
  196. """
  197. c = template.Context({})
  198. t = template.Template('{% load custom %}{% inclusion_tag_use_l10n %}')
  199. self.assertEqual(t.render(c).strip(), 'None')
  200. c.use_l10n = True
  201. self.assertEqual(t.render(c).strip(), 'True')
  202. def test_assignment_tags(self):
  203. c = template.Context({'value': 42})
  204. t = template.Template('{% load custom %}{% assignment_no_params as var %}The result is: {{ var }}')
  205. self.assertEqual(t.render(c), 'The result is: assignment_no_params - Expected result')
  206. t = template.Template('{% load custom %}{% assignment_one_param 37 as var %}The result is: {{ var }}')
  207. self.assertEqual(t.render(c), 'The result is: assignment_one_param - Expected result: 37')
  208. t = template.Template('{% load custom %}{% assignment_explicit_no_context 37 as var %}The result is: {{ var }}')
  209. self.assertEqual(t.render(c), 'The result is: assignment_explicit_no_context - Expected result: 37')
  210. t = template.Template('{% load custom %}{% assignment_no_params_with_context as var %}The result is: {{ var }}')
  211. self.assertEqual(t.render(c), 'The result is: assignment_no_params_with_context - Expected result (context value: 42)')
  212. t = template.Template('{% load custom %}{% assignment_params_and_context 37 as var %}The result is: {{ var }}')
  213. self.assertEqual(t.render(c), 'The result is: assignment_params_and_context - Expected result (context value: 42): 37')
  214. t = template.Template('{% load custom %}{% assignment_two_params 37 42 as var %}The result is: {{ var }}')
  215. self.assertEqual(t.render(c), 'The result is: assignment_two_params - Expected result: 37, 42')
  216. t = template.Template('{% load custom %}{% assignment_one_default 37 as var %}The result is: {{ var }}')
  217. self.assertEqual(t.render(c), 'The result is: assignment_one_default - Expected result: 37, hi')
  218. t = template.Template('{% load custom %}{% assignment_one_default 37 two="hello" as var %}The result is: {{ var }}')
  219. self.assertEqual(t.render(c), 'The result is: assignment_one_default - Expected result: 37, hello')
  220. t = template.Template('{% load custom %}{% assignment_one_default one=99 two="hello" as var %}The result is: {{ var }}')
  221. self.assertEqual(t.render(c), 'The result is: assignment_one_default - Expected result: 99, hello')
  222. six.assertRaisesRegex(self, template.TemplateSyntaxError,
  223. "'assignment_one_default' received unexpected keyword argument 'three'",
  224. template.Template, '{% load custom %}{% assignment_one_default 99 two="hello" three="foo" as var %}')
  225. t = template.Template('{% load custom %}{% assignment_one_default 37 42 as var %}The result is: {{ var }}')
  226. self.assertEqual(t.render(c), 'The result is: assignment_one_default - Expected result: 37, 42')
  227. t = template.Template('{% load custom %}{% assignment_unlimited_args 37 as var %}The result is: {{ var }}')
  228. self.assertEqual(t.render(c), 'The result is: assignment_unlimited_args - Expected result: 37, hi')
  229. t = template.Template('{% load custom %}{% assignment_unlimited_args 37 42 56 89 as var %}The result is: {{ var }}')
  230. self.assertEqual(t.render(c), 'The result is: assignment_unlimited_args - Expected result: 37, 42, 56, 89')
  231. t = template.Template('{% load custom %}{% assignment_only_unlimited_args as var %}The result is: {{ var }}')
  232. self.assertEqual(t.render(c), 'The result is: assignment_only_unlimited_args - Expected result: ')
  233. t = template.Template('{% load custom %}{% assignment_only_unlimited_args 37 42 56 89 as var %}The result is: {{ var }}')
  234. self.assertEqual(t.render(c), 'The result is: assignment_only_unlimited_args - Expected result: 37, 42, 56, 89')
  235. six.assertRaisesRegex(self, template.TemplateSyntaxError,
  236. "'assignment_one_param' tag takes at least 2 arguments and the second last argument must be 'as'",
  237. template.Template, '{% load custom %}{% assignment_one_param 37 %}The result is: {{ var }}')
  238. six.assertRaisesRegex(self, template.TemplateSyntaxError,
  239. "'assignment_one_param' tag takes at least 2 arguments and the second last argument must be 'as'",
  240. template.Template, '{% load custom %}{% assignment_one_param 37 as %}The result is: {{ var }}')
  241. six.assertRaisesRegex(self, template.TemplateSyntaxError,
  242. "'assignment_one_param' tag takes at least 2 arguments and the second last argument must be 'as'",
  243. template.Template, '{% load custom %}{% assignment_one_param 37 ass var %}The result is: {{ var }}')
  244. six.assertRaisesRegex(self, template.TemplateSyntaxError,
  245. "'assignment_two_params' received too many positional arguments",
  246. template.Template, '{% load custom %}{% assignment_two_params 37 42 56 as var %}The result is: {{ var }}')
  247. six.assertRaisesRegex(self, template.TemplateSyntaxError,
  248. "'assignment_one_default' received too many positional arguments",
  249. template.Template, '{% load custom %}{% assignment_one_default 37 42 56 as var %}The result is: {{ var }}')
  250. six.assertRaisesRegex(self, template.TemplateSyntaxError,
  251. "'assignment_one_default' did not receive value\(s\) for the argument\(s\): 'one'",
  252. template.Template, '{% load custom %}{% assignment_one_default as var %}The result is: {{ var }}')
  253. six.assertRaisesRegex(self, template.TemplateSyntaxError,
  254. "'assignment_unlimited_args' did not receive value\(s\) for the argument\(s\): 'one'",
  255. template.Template, '{% load custom %}{% assignment_unlimited_args as var %}The result is: {{ var }}')
  256. t = template.Template('{% load custom %}{% assignment_unlimited_args_kwargs 37 40|add:2 56 eggs="scrambled" four=1|add:3 as var %}The result is: {{ var }}')
  257. self.assertEqual(t.render(c), 'The result is: assignment_unlimited_args_kwargs - Expected result: 37, 42, 56 / eggs=scrambled, four=4')
  258. six.assertRaisesRegex(self, template.TemplateSyntaxError,
  259. "'assignment_unlimited_args_kwargs' received some positional argument\(s\) after some keyword argument\(s\)",
  260. template.Template, '{% load custom %}{% assignment_unlimited_args_kwargs 37 40|add:2 eggs="scrambled" 56 four=1|add:3 as var %}The result is: {{ var }}')
  261. six.assertRaisesRegex(self, template.TemplateSyntaxError,
  262. "'assignment_unlimited_args_kwargs' received multiple values for keyword argument 'eggs'",
  263. template.Template, '{% load custom %}{% assignment_unlimited_args_kwargs 37 eggs="scrambled" eggs="scrambled" as var %}The result is: {{ var }}')
  264. def test_assignment_tag_registration(self):
  265. # Test that the decorators preserve the decorated function's docstring, name and attributes.
  266. self.verify_tag(custom.assignment_no_params, 'assignment_no_params')
  267. self.verify_tag(custom.assignment_one_param, 'assignment_one_param')
  268. self.verify_tag(custom.assignment_explicit_no_context, 'assignment_explicit_no_context')
  269. self.verify_tag(custom.assignment_no_params_with_context, 'assignment_no_params_with_context')
  270. self.verify_tag(custom.assignment_params_and_context, 'assignment_params_and_context')
  271. self.verify_tag(custom.assignment_one_default, 'assignment_one_default')
  272. self.verify_tag(custom.assignment_two_params, 'assignment_two_params')
  273. self.verify_tag(custom.assignment_unlimited_args, 'assignment_unlimited_args')
  274. self.verify_tag(custom.assignment_only_unlimited_args, 'assignment_only_unlimited_args')
  275. self.verify_tag(custom.assignment_unlimited_args, 'assignment_unlimited_args')
  276. self.verify_tag(custom.assignment_unlimited_args_kwargs, 'assignment_unlimited_args_kwargs')
  277. self.verify_tag(custom.assignment_tag_without_context_parameter, 'assignment_tag_without_context_parameter')
  278. def test_assignment_tag_missing_context(self):
  279. # The 'context' parameter must be present when takes_context is True
  280. six.assertRaisesRegex(self, template.TemplateSyntaxError,
  281. "'assignment_tag_without_context_parameter' is decorated with takes_context=True so it must have a first argument of 'context'",
  282. template.Template, '{% load custom %}{% assignment_tag_without_context_parameter 123 as var %}')