2011-08-26 18:21:26 +08:00
|
|
|
# -*- coding: utf-8 -*-
|
|
|
|
"""
|
2014-09-01 03:54:45 +08:00
|
|
|
tests.templating
|
2011-08-26 18:21:26 +08:00
|
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
|
|
|
|
Template functionality
|
|
|
|
|
2014-01-03 02:21:07 +08:00
|
|
|
:copyright: (c) 2014 by Armin Ronacher.
|
2011-08-26 18:21:26 +08:00
|
|
|
:license: BSD, see LICENSE for more details.
|
|
|
|
"""
|
2011-09-02 00:35:04 +08:00
|
|
|
|
2011-08-26 18:21:26 +08:00
|
|
|
import flask
|
|
|
|
import unittest
|
2014-09-03 23:57:44 +08:00
|
|
|
import logging
|
|
|
|
from jinja2 import TemplateNotFound
|
|
|
|
|
2014-09-01 03:56:15 +08:00
|
|
|
from tests import TestFlask
|
2011-08-26 18:21:26 +08:00
|
|
|
|
|
|
|
|
2014-09-01 03:56:15 +08:00
|
|
|
class TestTemplating(TestFlask):
|
2011-08-26 18:21:26 +08:00
|
|
|
|
|
|
|
def test_context_processing(self):
|
|
|
|
app = flask.Flask(__name__)
|
|
|
|
@app.context_processor
|
|
|
|
def context_processor():
|
|
|
|
return {'injected_value': 42}
|
|
|
|
@app.route('/')
|
|
|
|
def index():
|
|
|
|
return flask.render_template('context_template.html', value=23)
|
|
|
|
rv = app.test_client().get('/')
|
2013-05-22 23:05:48 +08:00
|
|
|
self.assert_equal(rv.data, b'<p>23|42')
|
2011-08-26 18:21:26 +08:00
|
|
|
|
|
|
|
def test_original_win(self):
|
|
|
|
app = flask.Flask(__name__)
|
|
|
|
@app.route('/')
|
|
|
|
def index():
|
|
|
|
return flask.render_template_string('{{ config }}', config=42)
|
|
|
|
rv = app.test_client().get('/')
|
2013-05-22 23:05:48 +08:00
|
|
|
self.assert_equal(rv.data, b'42')
|
2011-08-26 18:21:26 +08:00
|
|
|
|
2012-10-08 13:01:49 +08:00
|
|
|
def test_request_less_rendering(self):
|
|
|
|
app = flask.Flask(__name__)
|
|
|
|
app.config['WORLD_NAME'] = 'Special World'
|
|
|
|
@app.context_processor
|
|
|
|
def context_processor():
|
|
|
|
return dict(foo=42)
|
|
|
|
|
|
|
|
with app.app_context():
|
|
|
|
rv = flask.render_template_string('Hello {{ config.WORLD_NAME }} '
|
|
|
|
'{{ foo }}')
|
|
|
|
self.assert_equal(rv, 'Hello Special World 42')
|
|
|
|
|
2011-08-26 18:21:26 +08:00
|
|
|
def test_standard_context(self):
|
|
|
|
app = flask.Flask(__name__)
|
|
|
|
app.secret_key = 'development key'
|
|
|
|
@app.route('/')
|
|
|
|
def index():
|
|
|
|
flask.g.foo = 23
|
|
|
|
flask.session['test'] = 'aha'
|
|
|
|
return flask.render_template_string('''
|
|
|
|
{{ request.args.foo }}
|
|
|
|
{{ g.foo }}
|
|
|
|
{{ config.DEBUG }}
|
|
|
|
{{ session.test }}
|
|
|
|
''')
|
|
|
|
rv = app.test_client().get('/?foo=42')
|
2013-05-22 23:14:07 +08:00
|
|
|
self.assert_equal(rv.data.split(), [b'42', b'23', b'False', b'aha'])
|
2011-08-26 18:21:26 +08:00
|
|
|
|
|
|
|
def test_escaping(self):
|
|
|
|
text = '<p>Hello World!'
|
|
|
|
app = flask.Flask(__name__)
|
|
|
|
@app.route('/')
|
|
|
|
def index():
|
|
|
|
return flask.render_template('escaping_template.html', text=text,
|
|
|
|
html=flask.Markup(text))
|
|
|
|
lines = app.test_client().get('/').data.splitlines()
|
2011-08-26 18:38:43 +08:00
|
|
|
self.assert_equal(lines, [
|
2013-05-22 23:14:07 +08:00
|
|
|
b'<p>Hello World!',
|
|
|
|
b'<p>Hello World!',
|
|
|
|
b'<p>Hello World!',
|
|
|
|
b'<p>Hello World!',
|
|
|
|
b'<p>Hello World!',
|
|
|
|
b'<p>Hello World!'
|
2011-08-26 18:38:43 +08:00
|
|
|
])
|
2011-08-26 18:21:26 +08:00
|
|
|
|
|
|
|
def test_no_escaping(self):
|
|
|
|
app = flask.Flask(__name__)
|
|
|
|
with app.test_request_context():
|
2011-08-26 18:43:27 +08:00
|
|
|
self.assert_equal(flask.render_template_string('{{ foo }}',
|
|
|
|
foo='<test>'), '<test>')
|
|
|
|
self.assert_equal(flask.render_template('mail.txt', foo='<test>'),
|
|
|
|
'<test> Mail')
|
2011-08-26 18:21:26 +08:00
|
|
|
|
|
|
|
def test_macros(self):
|
|
|
|
app = flask.Flask(__name__)
|
|
|
|
with app.test_request_context():
|
|
|
|
macro = flask.get_template_attribute('_macro.html', 'hello')
|
2011-08-26 18:38:43 +08:00
|
|
|
self.assert_equal(macro('World'), 'Hello World!')
|
2011-08-26 18:21:26 +08:00
|
|
|
|
|
|
|
def test_template_filter(self):
|
|
|
|
app = flask.Flask(__name__)
|
|
|
|
@app.template_filter()
|
|
|
|
def my_reverse(s):
|
|
|
|
return s[::-1]
|
2013-05-23 02:12:50 +08:00
|
|
|
self.assert_in('my_reverse', app.jinja_env.filters.keys())
|
2011-08-26 18:38:43 +08:00
|
|
|
self.assert_equal(app.jinja_env.filters['my_reverse'], my_reverse)
|
|
|
|
self.assert_equal(app.jinja_env.filters['my_reverse']('abcd'), 'dcba')
|
2011-08-26 18:21:26 +08:00
|
|
|
|
2012-01-17 09:21:26 +08:00
|
|
|
def test_add_template_filter(self):
|
|
|
|
app = flask.Flask(__name__)
|
|
|
|
def my_reverse(s):
|
|
|
|
return s[::-1]
|
|
|
|
app.add_template_filter(my_reverse)
|
2013-05-23 02:12:50 +08:00
|
|
|
self.assert_in('my_reverse', app.jinja_env.filters.keys())
|
2012-01-17 09:21:26 +08:00
|
|
|
self.assert_equal(app.jinja_env.filters['my_reverse'], my_reverse)
|
|
|
|
self.assert_equal(app.jinja_env.filters['my_reverse']('abcd'), 'dcba')
|
|
|
|
|
2011-08-26 18:21:26 +08:00
|
|
|
def test_template_filter_with_name(self):
|
|
|
|
app = flask.Flask(__name__)
|
|
|
|
@app.template_filter('strrev')
|
|
|
|
def my_reverse(s):
|
|
|
|
return s[::-1]
|
2013-05-23 02:12:50 +08:00
|
|
|
self.assert_in('strrev', app.jinja_env.filters.keys())
|
2011-08-26 18:38:43 +08:00
|
|
|
self.assert_equal(app.jinja_env.filters['strrev'], my_reverse)
|
|
|
|
self.assert_equal(app.jinja_env.filters['strrev']('abcd'), 'dcba')
|
2011-08-26 18:21:26 +08:00
|
|
|
|
2012-01-17 09:21:26 +08:00
|
|
|
def test_add_template_filter_with_name(self):
|
|
|
|
app = flask.Flask(__name__)
|
|
|
|
def my_reverse(s):
|
|
|
|
return s[::-1]
|
|
|
|
app.add_template_filter(my_reverse, 'strrev')
|
2013-05-23 02:12:50 +08:00
|
|
|
self.assert_in('strrev', app.jinja_env.filters.keys())
|
2012-01-17 09:21:26 +08:00
|
|
|
self.assert_equal(app.jinja_env.filters['strrev'], my_reverse)
|
|
|
|
self.assert_equal(app.jinja_env.filters['strrev']('abcd'), 'dcba')
|
|
|
|
|
2011-08-26 18:21:26 +08:00
|
|
|
def test_template_filter_with_template(self):
|
|
|
|
app = flask.Flask(__name__)
|
|
|
|
@app.template_filter()
|
|
|
|
def super_reverse(s):
|
|
|
|
return s[::-1]
|
|
|
|
@app.route('/')
|
|
|
|
def index():
|
|
|
|
return flask.render_template('template_filter.html', value='abcd')
|
|
|
|
rv = app.test_client().get('/')
|
2013-05-22 23:05:48 +08:00
|
|
|
self.assert_equal(rv.data, b'dcba')
|
2011-08-26 18:21:26 +08:00
|
|
|
|
2012-01-17 09:21:26 +08:00
|
|
|
def test_add_template_filter_with_template(self):
|
|
|
|
app = flask.Flask(__name__)
|
|
|
|
def super_reverse(s):
|
|
|
|
return s[::-1]
|
|
|
|
app.add_template_filter(super_reverse)
|
|
|
|
@app.route('/')
|
|
|
|
def index():
|
|
|
|
return flask.render_template('template_filter.html', value='abcd')
|
|
|
|
rv = app.test_client().get('/')
|
2013-05-22 23:05:48 +08:00
|
|
|
self.assert_equal(rv.data, b'dcba')
|
2012-01-17 09:21:26 +08:00
|
|
|
|
2011-08-26 18:21:26 +08:00
|
|
|
def test_template_filter_with_name_and_template(self):
|
|
|
|
app = flask.Flask(__name__)
|
|
|
|
@app.template_filter('super_reverse')
|
|
|
|
def my_reverse(s):
|
|
|
|
return s[::-1]
|
|
|
|
@app.route('/')
|
|
|
|
def index():
|
|
|
|
return flask.render_template('template_filter.html', value='abcd')
|
|
|
|
rv = app.test_client().get('/')
|
2013-05-22 23:05:48 +08:00
|
|
|
self.assert_equal(rv.data, b'dcba')
|
2011-08-26 18:21:26 +08:00
|
|
|
|
2012-01-17 09:21:26 +08:00
|
|
|
def test_add_template_filter_with_name_and_template(self):
|
|
|
|
app = flask.Flask(__name__)
|
|
|
|
def my_reverse(s):
|
|
|
|
return s[::-1]
|
|
|
|
app.add_template_filter(my_reverse, 'super_reverse')
|
|
|
|
@app.route('/')
|
|
|
|
def index():
|
|
|
|
return flask.render_template('template_filter.html', value='abcd')
|
|
|
|
rv = app.test_client().get('/')
|
2013-05-22 23:05:48 +08:00
|
|
|
self.assert_equal(rv.data, b'dcba')
|
2012-01-17 09:21:26 +08:00
|
|
|
|
2012-10-07 18:51:46 +08:00
|
|
|
def test_template_test(self):
|
|
|
|
app = flask.Flask(__name__)
|
|
|
|
@app.template_test()
|
|
|
|
def boolean(value):
|
|
|
|
return isinstance(value, bool)
|
2013-05-23 02:12:50 +08:00
|
|
|
self.assert_in('boolean', app.jinja_env.tests.keys())
|
2012-10-07 18:51:46 +08:00
|
|
|
self.assert_equal(app.jinja_env.tests['boolean'], boolean)
|
2013-05-22 23:23:38 +08:00
|
|
|
self.assert_true(app.jinja_env.tests['boolean'](False))
|
2012-10-07 18:51:46 +08:00
|
|
|
|
|
|
|
def test_add_template_test(self):
|
|
|
|
app = flask.Flask(__name__)
|
|
|
|
def boolean(value):
|
|
|
|
return isinstance(value, bool)
|
|
|
|
app.add_template_test(boolean)
|
2013-05-23 02:12:50 +08:00
|
|
|
self.assert_in('boolean', app.jinja_env.tests.keys())
|
2012-10-07 18:51:46 +08:00
|
|
|
self.assert_equal(app.jinja_env.tests['boolean'], boolean)
|
2013-05-22 23:23:38 +08:00
|
|
|
self.assert_true(app.jinja_env.tests['boolean'](False))
|
2012-10-07 18:51:46 +08:00
|
|
|
|
|
|
|
def test_template_test_with_name(self):
|
|
|
|
app = flask.Flask(__name__)
|
|
|
|
@app.template_test('boolean')
|
|
|
|
def is_boolean(value):
|
|
|
|
return isinstance(value, bool)
|
2013-05-23 02:12:50 +08:00
|
|
|
self.assert_in('boolean', app.jinja_env.tests.keys())
|
2012-10-07 18:51:46 +08:00
|
|
|
self.assert_equal(app.jinja_env.tests['boolean'], is_boolean)
|
2013-05-22 23:23:38 +08:00
|
|
|
self.assert_true(app.jinja_env.tests['boolean'](False))
|
2012-10-07 18:51:46 +08:00
|
|
|
|
|
|
|
def test_add_template_test_with_name(self):
|
|
|
|
app = flask.Flask(__name__)
|
|
|
|
def is_boolean(value):
|
|
|
|
return isinstance(value, bool)
|
|
|
|
app.add_template_test(is_boolean, 'boolean')
|
2013-05-23 02:12:50 +08:00
|
|
|
self.assert_in('boolean', app.jinja_env.tests.keys())
|
2012-10-07 18:51:46 +08:00
|
|
|
self.assert_equal(app.jinja_env.tests['boolean'], is_boolean)
|
2013-05-22 23:23:38 +08:00
|
|
|
self.assert_true(app.jinja_env.tests['boolean'](False))
|
2012-10-07 18:51:46 +08:00
|
|
|
|
|
|
|
def test_template_test_with_template(self):
|
|
|
|
app = flask.Flask(__name__)
|
|
|
|
@app.template_test()
|
|
|
|
def boolean(value):
|
|
|
|
return isinstance(value, bool)
|
|
|
|
@app.route('/')
|
|
|
|
def index():
|
|
|
|
return flask.render_template('template_test.html', value=False)
|
|
|
|
rv = app.test_client().get('/')
|
2013-05-23 02:12:50 +08:00
|
|
|
self.assert_in(b'Success!', rv.data)
|
2012-10-07 18:51:46 +08:00
|
|
|
|
|
|
|
def test_add_template_test_with_template(self):
|
|
|
|
app = flask.Flask(__name__)
|
|
|
|
def boolean(value):
|
|
|
|
return isinstance(value, bool)
|
|
|
|
app.add_template_test(boolean)
|
|
|
|
@app.route('/')
|
|
|
|
def index():
|
|
|
|
return flask.render_template('template_test.html', value=False)
|
|
|
|
rv = app.test_client().get('/')
|
2013-05-23 02:12:50 +08:00
|
|
|
self.assert_in(b'Success!', rv.data)
|
2012-10-07 18:51:46 +08:00
|
|
|
|
|
|
|
def test_template_test_with_name_and_template(self):
|
|
|
|
app = flask.Flask(__name__)
|
|
|
|
@app.template_test('boolean')
|
|
|
|
def is_boolean(value):
|
|
|
|
return isinstance(value, bool)
|
|
|
|
@app.route('/')
|
|
|
|
def index():
|
|
|
|
return flask.render_template('template_test.html', value=False)
|
|
|
|
rv = app.test_client().get('/')
|
2013-05-23 02:12:50 +08:00
|
|
|
self.assert_in(b'Success!', rv.data)
|
2012-10-07 18:51:46 +08:00
|
|
|
|
|
|
|
def test_add_template_test_with_name_and_template(self):
|
|
|
|
app = flask.Flask(__name__)
|
|
|
|
def is_boolean(value):
|
|
|
|
return isinstance(value, bool)
|
|
|
|
app.add_template_test(is_boolean, 'boolean')
|
|
|
|
@app.route('/')
|
|
|
|
def index():
|
|
|
|
return flask.render_template('template_test.html', value=False)
|
|
|
|
rv = app.test_client().get('/')
|
2013-05-23 02:12:50 +08:00
|
|
|
self.assert_in(b'Success!', rv.data)
|
2012-10-07 18:51:46 +08:00
|
|
|
|
2013-01-27 08:46:19 +08:00
|
|
|
def test_add_template_global(self):
|
|
|
|
app = flask.Flask(__name__)
|
|
|
|
@app.template_global()
|
|
|
|
def get_stuff():
|
|
|
|
return 42
|
2013-05-23 02:12:50 +08:00
|
|
|
self.assert_in('get_stuff', app.jinja_env.globals.keys())
|
2013-01-27 08:46:19 +08:00
|
|
|
self.assert_equal(app.jinja_env.globals['get_stuff'], get_stuff)
|
2013-05-22 23:23:38 +08:00
|
|
|
self.assert_true(app.jinja_env.globals['get_stuff'](), 42)
|
2013-01-27 08:46:19 +08:00
|
|
|
with app.app_context():
|
|
|
|
rv = flask.render_template_string('{{ get_stuff() }}')
|
|
|
|
self.assert_equal(rv, '42')
|
|
|
|
|
2011-08-26 18:21:26 +08:00
|
|
|
def test_custom_template_loader(self):
|
|
|
|
class MyFlask(flask.Flask):
|
|
|
|
def create_global_jinja_loader(self):
|
|
|
|
from jinja2 import DictLoader
|
|
|
|
return DictLoader({'index.html': 'Hello Custom World!'})
|
|
|
|
app = MyFlask(__name__)
|
|
|
|
@app.route('/')
|
|
|
|
def index():
|
|
|
|
return flask.render_template('index.html')
|
|
|
|
c = app.test_client()
|
|
|
|
rv = c.get('/')
|
2013-05-22 23:05:48 +08:00
|
|
|
self.assert_equal(rv.data, b'Hello Custom World!')
|
2011-08-26 18:21:26 +08:00
|
|
|
|
2012-02-24 14:46:20 +08:00
|
|
|
def test_iterable_loader(self):
|
|
|
|
app = flask.Flask(__name__)
|
|
|
|
@app.context_processor
|
|
|
|
def context_processor():
|
|
|
|
return {'whiskey': 'Jameson'}
|
|
|
|
@app.route('/')
|
|
|
|
def index():
|
|
|
|
return flask.render_template(
|
|
|
|
['no_template.xml', # should skip this one
|
|
|
|
'simple_template.html', # should render this
|
|
|
|
'context_template.html'],
|
|
|
|
value=23)
|
|
|
|
|
|
|
|
rv = app.test_client().get('/')
|
2013-05-22 23:05:48 +08:00
|
|
|
self.assert_equal(rv.data, b'<h1>Jameson</h1>')
|
2012-02-24 14:46:20 +08:00
|
|
|
|
2013-09-30 23:40:35 +08:00
|
|
|
def test_templates_auto_reload(self):
|
|
|
|
app = flask.Flask(__name__)
|
|
|
|
self.assert_true(app.config['TEMPLATES_AUTO_RELOAD'])
|
|
|
|
self.assert_true(app.jinja_env.auto_reload)
|
|
|
|
app = flask.Flask(__name__)
|
|
|
|
app.config['TEMPLATES_AUTO_RELOAD'] = False
|
|
|
|
self.assert_false(app.jinja_env.auto_reload)
|
|
|
|
|
2014-09-03 23:57:44 +08:00
|
|
|
def test_template_loader_debugging(self):
|
|
|
|
from blueprintapp import app
|
|
|
|
|
|
|
|
called = []
|
|
|
|
class _TestHandler(logging.Handler):
|
|
|
|
def handle(x, record):
|
|
|
|
called.append(True)
|
2014-09-04 01:17:43 +08:00
|
|
|
text = str(record.msg)
|
2014-09-03 23:57:44 +08:00
|
|
|
self.assert_('1: trying loader of application '
|
|
|
|
'"blueprintapp"' in text)
|
|
|
|
self.assert_('2: trying loader of blueprint "admin" '
|
|
|
|
'(blueprintapp.apps.admin)' in text)
|
|
|
|
self.assert_('trying loader of blueprint "frontend" '
|
|
|
|
'(blueprintapp.apps.frontend)' in text)
|
|
|
|
self.assert_('Error: the template could not be found' in text)
|
|
|
|
self.assert_('looked up from an endpoint that belongs to '
|
|
|
|
'the blueprint "frontend"' in text)
|
|
|
|
self.assert_(
|
|
|
|
'See http://flask.pocoo.org/docs/blueprints/#templates' in text)
|
|
|
|
|
|
|
|
with app.test_client() as c:
|
|
|
|
try:
|
|
|
|
old_load_setting = app.config['EXPLAIN_TEMPLATE_LOADING']
|
|
|
|
old_handlers = app.logger.handlers[:]
|
|
|
|
app.logger.handlers = [_TestHandler()]
|
|
|
|
app.config['EXPLAIN_TEMPLATE_LOADING'] = True
|
|
|
|
|
|
|
|
try:
|
|
|
|
c.get('/missing')
|
|
|
|
except TemplateNotFound as e:
|
|
|
|
self.assert_('missing_template.html' in str(e))
|
|
|
|
else:
|
|
|
|
self.fail('Expected template not found exception.')
|
|
|
|
finally:
|
|
|
|
app.logger.handlers[:] = old_handlers
|
|
|
|
app.config['EXPLAIN_TEMPLATE_LOADING'] = old_load_setting
|
|
|
|
|
|
|
|
self.assert_equal(len(called), 1)
|
|
|
|
|
2012-02-24 14:46:20 +08:00
|
|
|
|
2011-08-26 18:21:26 +08:00
|
|
|
def suite():
|
|
|
|
suite = unittest.TestSuite()
|
2014-09-01 03:56:15 +08:00
|
|
|
suite.addTest(unittest.makeSuite(TestTemplating))
|
2011-08-26 18:21:26 +08:00
|
|
|
return suite
|