/flask/testsuite/templating.py

https://github.com/bowlingb/flask
Python | 310 lines | 266 code | 34 blank | 10 comment | 4 complexity | 0d9fa7ab739b7393ac2538523a2fbf4a MD5 | raw file
  1. # -*- coding: utf-8 -*-
  2. """
  3. flask.testsuite.templating
  4. ~~~~~~~~~~~~~~~~~~~~~~~~~~
  5. Template functionality
  6. :copyright: (c) 2014 by Armin Ronacher.
  7. :license: BSD, see LICENSE for more details.
  8. """
  9. import flask
  10. import unittest
  11. from flask.testsuite import FlaskTestCase
  12. class TemplatingTestCase(FlaskTestCase):
  13. def test_context_processing(self):
  14. app = flask.Flask(__name__)
  15. @app.context_processor
  16. def context_processor():
  17. return {'injected_value': 42}
  18. @app.route('/')
  19. def index():
  20. return flask.render_template('context_template.html', value=23)
  21. rv = app.test_client().get('/')
  22. self.assert_equal(rv.data, b'<p>23|42')
  23. def test_original_win(self):
  24. app = flask.Flask(__name__)
  25. @app.route('/')
  26. def index():
  27. return flask.render_template_string('{{ config }}', config=42)
  28. rv = app.test_client().get('/')
  29. self.assert_equal(rv.data, b'42')
  30. def test_request_less_rendering(self):
  31. app = flask.Flask(__name__)
  32. app.config['WORLD_NAME'] = 'Special World'
  33. @app.context_processor
  34. def context_processor():
  35. return dict(foo=42)
  36. with app.app_context():
  37. rv = flask.render_template_string('Hello {{ config.WORLD_NAME }} '
  38. '{{ foo }}')
  39. self.assert_equal(rv, 'Hello Special World 42')
  40. def test_standard_context(self):
  41. app = flask.Flask(__name__)
  42. app.secret_key = 'development key'
  43. @app.route('/')
  44. def index():
  45. flask.g.foo = 23
  46. flask.session['test'] = 'aha'
  47. return flask.render_template_string('''
  48. {{ request.args.foo }}
  49. {{ g.foo }}
  50. {{ config.DEBUG }}
  51. {{ session.test }}
  52. ''')
  53. rv = app.test_client().get('/?foo=42')
  54. self.assert_equal(rv.data.split(), [b'42', b'23', b'False', b'aha'])
  55. def test_escaping(self):
  56. text = '<p>Hello World!'
  57. app = flask.Flask(__name__)
  58. @app.route('/')
  59. def index():
  60. return flask.render_template('escaping_template.html', text=text,
  61. html=flask.Markup(text))
  62. lines = app.test_client().get('/').data.splitlines()
  63. self.assert_equal(lines, [
  64. b'&lt;p&gt;Hello World!',
  65. b'<p>Hello World!',
  66. b'<p>Hello World!',
  67. b'<p>Hello World!',
  68. b'&lt;p&gt;Hello World!',
  69. b'<p>Hello World!'
  70. ])
  71. def test_no_escaping(self):
  72. app = flask.Flask(__name__)
  73. with app.test_request_context():
  74. self.assert_equal(flask.render_template_string('{{ foo }}',
  75. foo='<test>'), '<test>')
  76. self.assert_equal(flask.render_template('mail.txt', foo='<test>'),
  77. '<test> Mail')
  78. def test_macros(self):
  79. app = flask.Flask(__name__)
  80. with app.test_request_context():
  81. macro = flask.get_template_attribute('_macro.html', 'hello')
  82. self.assert_equal(macro('World'), 'Hello World!')
  83. def test_template_filter(self):
  84. app = flask.Flask(__name__)
  85. @app.template_filter()
  86. def my_reverse(s):
  87. return s[::-1]
  88. self.assert_in('my_reverse', app.jinja_env.filters.keys())
  89. self.assert_equal(app.jinja_env.filters['my_reverse'], my_reverse)
  90. self.assert_equal(app.jinja_env.filters['my_reverse']('abcd'), 'dcba')
  91. def test_add_template_filter(self):
  92. app = flask.Flask(__name__)
  93. def my_reverse(s):
  94. return s[::-1]
  95. app.add_template_filter(my_reverse)
  96. self.assert_in('my_reverse', app.jinja_env.filters.keys())
  97. self.assert_equal(app.jinja_env.filters['my_reverse'], my_reverse)
  98. self.assert_equal(app.jinja_env.filters['my_reverse']('abcd'), 'dcba')
  99. def test_template_filter_with_name(self):
  100. app = flask.Flask(__name__)
  101. @app.template_filter('strrev')
  102. def my_reverse(s):
  103. return s[::-1]
  104. self.assert_in('strrev', app.jinja_env.filters.keys())
  105. self.assert_equal(app.jinja_env.filters['strrev'], my_reverse)
  106. self.assert_equal(app.jinja_env.filters['strrev']('abcd'), 'dcba')
  107. def test_add_template_filter_with_name(self):
  108. app = flask.Flask(__name__)
  109. def my_reverse(s):
  110. return s[::-1]
  111. app.add_template_filter(my_reverse, 'strrev')
  112. self.assert_in('strrev', app.jinja_env.filters.keys())
  113. self.assert_equal(app.jinja_env.filters['strrev'], my_reverse)
  114. self.assert_equal(app.jinja_env.filters['strrev']('abcd'), 'dcba')
  115. def test_template_filter_with_template(self):
  116. app = flask.Flask(__name__)
  117. @app.template_filter()
  118. def super_reverse(s):
  119. return s[::-1]
  120. @app.route('/')
  121. def index():
  122. return flask.render_template('template_filter.html', value='abcd')
  123. rv = app.test_client().get('/')
  124. self.assert_equal(rv.data, b'dcba')
  125. def test_add_template_filter_with_template(self):
  126. app = flask.Flask(__name__)
  127. def super_reverse(s):
  128. return s[::-1]
  129. app.add_template_filter(super_reverse)
  130. @app.route('/')
  131. def index():
  132. return flask.render_template('template_filter.html', value='abcd')
  133. rv = app.test_client().get('/')
  134. self.assert_equal(rv.data, b'dcba')
  135. def test_template_filter_with_name_and_template(self):
  136. app = flask.Flask(__name__)
  137. @app.template_filter('super_reverse')
  138. def my_reverse(s):
  139. return s[::-1]
  140. @app.route('/')
  141. def index():
  142. return flask.render_template('template_filter.html', value='abcd')
  143. rv = app.test_client().get('/')
  144. self.assert_equal(rv.data, b'dcba')
  145. def test_add_template_filter_with_name_and_template(self):
  146. app = flask.Flask(__name__)
  147. def my_reverse(s):
  148. return s[::-1]
  149. app.add_template_filter(my_reverse, 'super_reverse')
  150. @app.route('/')
  151. def index():
  152. return flask.render_template('template_filter.html', value='abcd')
  153. rv = app.test_client().get('/')
  154. self.assert_equal(rv.data, b'dcba')
  155. def test_template_test(self):
  156. app = flask.Flask(__name__)
  157. @app.template_test()
  158. def boolean(value):
  159. return isinstance(value, bool)
  160. self.assert_in('boolean', app.jinja_env.tests.keys())
  161. self.assert_equal(app.jinja_env.tests['boolean'], boolean)
  162. self.assert_true(app.jinja_env.tests['boolean'](False))
  163. def test_add_template_test(self):
  164. app = flask.Flask(__name__)
  165. def boolean(value):
  166. return isinstance(value, bool)
  167. app.add_template_test(boolean)
  168. self.assert_in('boolean', app.jinja_env.tests.keys())
  169. self.assert_equal(app.jinja_env.tests['boolean'], boolean)
  170. self.assert_true(app.jinja_env.tests['boolean'](False))
  171. def test_template_test_with_name(self):
  172. app = flask.Flask(__name__)
  173. @app.template_test('boolean')
  174. def is_boolean(value):
  175. return isinstance(value, bool)
  176. self.assert_in('boolean', app.jinja_env.tests.keys())
  177. self.assert_equal(app.jinja_env.tests['boolean'], is_boolean)
  178. self.assert_true(app.jinja_env.tests['boolean'](False))
  179. def test_add_template_test_with_name(self):
  180. app = flask.Flask(__name__)
  181. def is_boolean(value):
  182. return isinstance(value, bool)
  183. app.add_template_test(is_boolean, 'boolean')
  184. self.assert_in('boolean', app.jinja_env.tests.keys())
  185. self.assert_equal(app.jinja_env.tests['boolean'], is_boolean)
  186. self.assert_true(app.jinja_env.tests['boolean'](False))
  187. def test_template_test_with_template(self):
  188. app = flask.Flask(__name__)
  189. @app.template_test()
  190. def boolean(value):
  191. return isinstance(value, bool)
  192. @app.route('/')
  193. def index():
  194. return flask.render_template('template_test.html', value=False)
  195. rv = app.test_client().get('/')
  196. self.assert_in(b'Success!', rv.data)
  197. def test_add_template_test_with_template(self):
  198. app = flask.Flask(__name__)
  199. def boolean(value):
  200. return isinstance(value, bool)
  201. app.add_template_test(boolean)
  202. @app.route('/')
  203. def index():
  204. return flask.render_template('template_test.html', value=False)
  205. rv = app.test_client().get('/')
  206. self.assert_in(b'Success!', rv.data)
  207. def test_template_test_with_name_and_template(self):
  208. app = flask.Flask(__name__)
  209. @app.template_test('boolean')
  210. def is_boolean(value):
  211. return isinstance(value, bool)
  212. @app.route('/')
  213. def index():
  214. return flask.render_template('template_test.html', value=False)
  215. rv = app.test_client().get('/')
  216. self.assert_in(b'Success!', rv.data)
  217. def test_add_template_test_with_name_and_template(self):
  218. app = flask.Flask(__name__)
  219. def is_boolean(value):
  220. return isinstance(value, bool)
  221. app.add_template_test(is_boolean, 'boolean')
  222. @app.route('/')
  223. def index():
  224. return flask.render_template('template_test.html', value=False)
  225. rv = app.test_client().get('/')
  226. self.assert_in(b'Success!', rv.data)
  227. def test_add_template_global(self):
  228. app = flask.Flask(__name__)
  229. @app.template_global()
  230. def get_stuff():
  231. return 42
  232. self.assert_in('get_stuff', app.jinja_env.globals.keys())
  233. self.assert_equal(app.jinja_env.globals['get_stuff'], get_stuff)
  234. self.assert_true(app.jinja_env.globals['get_stuff'](), 42)
  235. with app.app_context():
  236. rv = flask.render_template_string('{{ get_stuff() }}')
  237. self.assert_equal(rv, '42')
  238. def test_custom_template_loader(self):
  239. class MyFlask(flask.Flask):
  240. def create_global_jinja_loader(self):
  241. from jinja2 import DictLoader
  242. return DictLoader({'index.html': 'Hello Custom World!'})
  243. app = MyFlask(__name__)
  244. @app.route('/')
  245. def index():
  246. return flask.render_template('index.html')
  247. c = app.test_client()
  248. rv = c.get('/')
  249. self.assert_equal(rv.data, b'Hello Custom World!')
  250. def test_iterable_loader(self):
  251. app = flask.Flask(__name__)
  252. @app.context_processor
  253. def context_processor():
  254. return {'whiskey': 'Jameson'}
  255. @app.route('/')
  256. def index():
  257. return flask.render_template(
  258. ['no_template.xml', # should skip this one
  259. 'simple_template.html', # should render this
  260. 'context_template.html'],
  261. value=23)
  262. rv = app.test_client().get('/')
  263. self.assert_equal(rv.data, b'<h1>Jameson</h1>')
  264. def test_templates_auto_reload(self):
  265. app = flask.Flask(__name__)
  266. self.assert_true(app.config['TEMPLATES_AUTO_RELOAD'])
  267. self.assert_true(app.jinja_env.auto_reload)
  268. app = flask.Flask(__name__)
  269. app.config['TEMPLATES_AUTO_RELOAD'] = False
  270. self.assert_false(app.jinja_env.auto_reload)
  271. def suite():
  272. suite = unittest.TestSuite()
  273. suite.addTest(unittest.makeSuite(TemplatingTestCase))
  274. return suite