blob: 598cb456e3dbd90163422ba1d99de770234559f1 [file] [log] [blame]
# -*- coding: utf-8 -*-
import unittest
from mako import compat
from mako.compat import u
from mako.template import Template
from test import eq_
from test import requires_python_2
from test import TemplateTest
from test.util import flatten_result
from test.util import result_lines
class FilterTest(TemplateTest):
def test_basic(self):
t = Template(
"""
${x | myfilter}
"""
)
assert (
flatten_result(
t.render(
x="this is x",
myfilter=lambda t: "MYFILTER->%s<-MYFILTER" % t,
)
)
== "MYFILTER->this is x<-MYFILTER"
)
def test_expr(self):
"""test filters that are themselves expressions"""
t = Template(
"""
${x | myfilter(y)}
"""
)
def myfilter(y):
return lambda x: "MYFILTER->%s<-%s" % (x, y)
assert (
flatten_result(
t.render(x="this is x", myfilter=myfilter, y="this is y")
)
== "MYFILTER->this is x<-this is y"
)
def test_convert_str(self):
"""test that string conversion happens in expressions before
sending to filters"""
t = Template(
"""
${x | trim}
"""
)
assert flatten_result(t.render(x=5)) == "5"
def test_quoting(self):
t = Template(
"""
foo ${bar | h}
"""
)
eq_(
flatten_result(t.render(bar="<'some bar'>")),
"foo &lt;&#39;some bar&#39;&gt;",
)
def test_url_escaping(self):
t = Template(
"""
http://example.com/?bar=${bar | u}&v=1
"""
)
eq_(
flatten_result(t.render(bar=u"酒吧bar")),
"http://example.com/?bar=%E9%85%92%E5%90%A7bar&v=1",
)
def test_entity(self):
t = Template("foo ${bar | entity}")
eq_(
flatten_result(t.render(bar="<'some bar'>")),
"foo &lt;'some bar'&gt;",
)
@requires_python_2
def test_quoting_non_unicode(self):
t = Template(
"""
foo ${bar | h}
""",
disable_unicode=True,
output_encoding=None,
)
eq_(
flatten_result(t.render(bar="<'привет'>")),
"foo &lt;&#39;привет&#39;&gt;",
)
@requires_python_2
def test_url_escaping_non_unicode(self):
t = Template(
"""
http://example.com/?bar=${bar | u}&v=1
""",
disable_unicode=True,
output_encoding=None,
)
eq_(
flatten_result(t.render(bar="酒吧bar")),
"http://example.com/?bar=%E9%85%92%E5%90%A7bar&v=1",
)
def test_def(self):
t = Template(
"""
<%def name="foo()" filter="myfilter">
this is foo
</%def>
${foo()}
"""
)
eq_(
flatten_result(
t.render(
x="this is x",
myfilter=lambda t: "MYFILTER->%s<-MYFILTER" % t,
)
),
"MYFILTER-> this is foo <-MYFILTER",
)
def test_import(self):
t = Template(
"""
<%!
from mako import filters
%>\
trim this string: """
"""${" some string to trim " | filters.trim} continue\
"""
)
assert (
t.render().strip()
== "trim this string: some string to trim continue"
)
def test_import_2(self):
t = Template(
"""
trim this string: """
"""${" some string to trim " | filters.trim} continue\
""",
imports=["from mako import filters"],
)
# print t.code
assert (
t.render().strip()
== "trim this string: some string to trim continue"
)
def test_encode_filter(self):
t = Template(
"""# coding: utf-8
some stuff.... ${x}
""",
default_filters=["decode.utf8"],
)
eq_(
t.render_unicode(x=u("voix m’a réveillé")).strip(),
u("some stuff.... voix m’a réveillé"),
)
def test_encode_filter_non_str(self):
t = Template(
"""# coding: utf-8
some stuff.... ${x}
""",
default_filters=["decode.utf8"],
)
eq_(t.render_unicode(x=3).strip(), u("some stuff.... 3"))
@requires_python_2
def test_encode_filter_non_str_we_return_bytes(self):
class Foo(object):
def __str__(self):
return compat.b("å")
t = Template(
"""# coding: utf-8
some stuff.... ${x}
""",
default_filters=["decode.utf8"],
)
eq_(t.render_unicode(x=Foo()).strip(), u("some stuff.... å"))
def test_custom_default(self):
t = Template(
"""
<%!
def myfilter(x):
return "->" + x + "<-"
%>
hi ${'there'}
""",
default_filters=["myfilter"],
)
assert t.render().strip() == "hi ->there<-"
def test_global(self):
t = Template(
"""
<%page expression_filter="h"/>
${"<tag>this is html</tag>"}
"""
)
assert t.render().strip() == "&lt;tag&gt;this is html&lt;/tag&gt;"
def test_block_via_context(self):
t = Template(
"""
<%block name="foo" filter="myfilter">
some text
</%block>
"""
)
def myfilter(text):
return "MYTEXT" + text
eq_(result_lines(t.render(myfilter=myfilter)), ["MYTEXT", "some text"])
def test_def_via_context(self):
t = Template(
"""
<%def name="foo()" filter="myfilter">
some text
</%def>
${foo()}
"""
)
def myfilter(text):
return "MYTEXT" + text
eq_(result_lines(t.render(myfilter=myfilter)), ["MYTEXT", "some text"])
def test_text_via_context(self):
t = Template(
"""
<%text filter="myfilter">
some text
</%text>
"""
)
def myfilter(text):
return "MYTEXT" + text
eq_(result_lines(t.render(myfilter=myfilter)), ["MYTEXT", "some text"])
def test_nflag(self):
t = Template(
"""
${"<tag>this is html</tag>" | n}
""",
default_filters=["h", "unicode"],
)
assert t.render().strip() == "<tag>this is html</tag>"
t = Template(
"""
<%page expression_filter="h"/>
${"<tag>this is html</tag>" | n}
"""
)
assert t.render().strip() == "<tag>this is html</tag>"
t = Template(
"""
<%page expression_filter="h"/>
${"<tag>this is html</tag>" | n, h}
"""
)
assert t.render().strip() == "&lt;tag&gt;this is html&lt;/tag&gt;"
def test_non_expression(self):
t = Template(
"""
<%!
def a(text):
return "this is a"
def b(text):
return "this is b"
%>
${foo()}
<%def name="foo()" buffered="True">
this is text
</%def>
""",
buffer_filters=["a"],
)
assert t.render().strip() == "this is a"
t = Template(
"""
<%!
def a(text):
return "this is a"
def b(text):
return "this is b"
%>
${'hi'}
${foo()}
<%def name="foo()" buffered="True">
this is text
</%def>
""",
buffer_filters=["a"],
default_filters=["b"],
)
assert flatten_result(t.render()) == "this is b this is b"
t = Template(
"""
<%!
class Foo(object):
foo = True
def __str__(self):
return "this is a"
def a(text):
return Foo()
def b(text):
if hasattr(text, 'foo'):
return str(text)
else:
return "this is b"
%>
${'hi'}
${foo()}
<%def name="foo()" buffered="True">
this is text
</%def>
""",
buffer_filters=["a"],
default_filters=["b"],
)
assert flatten_result(t.render()) == "this is b this is a"
t = Template(
"""
<%!
def a(text):
return "this is a"
def b(text):
return "this is b"
%>
${foo()}
${bar()}
<%def name="foo()" filter="b">
this is text
</%def>
<%def name="bar()" filter="b" buffered="True">
this is text
</%def>
""",
buffer_filters=["a"],
)
assert flatten_result(t.render()) == "this is b this is a"
def test_builtins(self):
t = Template(
"""
${"this is <text>" | h}
"""
)
assert flatten_result(t.render()) == "this is &lt;text&gt;"
t = Template(
"""
http://foo.com/arg1=${"hi! this is a string." | u}
"""
)
assert (
flatten_result(t.render())
== "http://foo.com/arg1=hi%21+this+is+a+string."
)
class BufferTest(unittest.TestCase):
def test_buffered_def(self):
t = Template(
"""
<%def name="foo()" buffered="True">
this is foo
</%def>
${"hi->" + foo() + "<-hi"}
"""
)
assert flatten_result(t.render()) == "hi-> this is foo <-hi"
def test_unbuffered_def(self):
t = Template(
"""
<%def name="foo()" buffered="False">
this is foo
</%def>
${"hi->" + foo() + "<-hi"}
"""
)
assert flatten_result(t.render()) == "this is foo hi-><-hi"
def test_capture(self):
t = Template(
"""
<%def name="foo()" buffered="False">
this is foo
</%def>
${"hi->" + capture(foo) + "<-hi"}
"""
)
assert flatten_result(t.render()) == "hi-> this is foo <-hi"
def test_capture_exception(self):
template = Template(
"""
<%def name="a()">
this is a
<%
raise TypeError("hi")
%>
</%def>
<%
c = capture(a)
%>
a->${c}<-a
"""
)
try:
template.render()
assert False
except TypeError:
assert True
def test_buffered_exception(self):
template = Template(
"""
<%def name="a()" buffered="True">
<%
raise TypeError("hi")
%>
</%def>
${a()}
"""
)
try:
print(template.render())
assert False
except TypeError:
assert True
def test_capture_ccall(self):
t = Template(
"""
<%def name="foo()">
<%
x = capture(caller.body)
%>
this is foo. body: ${x}
</%def>
<%call expr="foo()">
ccall body
</%call>
"""
)
# print t.render()
assert flatten_result(t.render()) == "this is foo. body: ccall body"