import os
import tempfile
from mako import exceptions
from mako import lookup
from mako import runtime
from mako.template import Template
from mako.testing.assertions import assert_raises_message
from mako.testing.assertions import assert_raises_with_given_cause
from mako.testing.config import config
from mako.testing.helpers import file_with_template_code
from mako.testing.helpers import replace_file_with_dir
from mako.testing.helpers import result_lines
from mako.testing.helpers import rewind_compile_time
from mako.util import FastEncodingBuffer
tl = lookup.TemplateLookup(directories=[config.template_base])
class LookupTest:
def test_basic(self):
t = tl.get_template("index.html")
assert result_lines(t.render()) == ["this is index"]
def test_subdir(self):
t = tl.get_template("/subdir/index.html")
assert result_lines(t.render()) == [
"this is sub index",
"this is include 2",
]
assert (
tl.get_template("/subdir/index.html").module_id
== "_subdir_index_html"
)
def test_updir(self):
t = tl.get_template("/subdir/foo/../bar/../index.html")
assert result_lines(t.render()) == [
"this is sub index",
"this is include 2",
]
def test_directory_lookup(self):
"""test that hitting an existent directory still raises
LookupError."""
assert_raises_with_given_cause(
exceptions.TopLevelLookupException,
KeyError,
tl.get_template,
"/subdir",
)
def test_no_lookup(self):
t = Template("hi <%include file='foo.html'/>")
assert_raises_message(
exceptions.TemplateLookupException,
"Template 'memory:%s' has no TemplateLookup associated"
% hex(id(t)),
t.render,
)
def test_uri_adjust(self):
tl = lookup.TemplateLookup(directories=["/foo/bar"])
assert (
tl.filename_to_uri("/foo/bar/etc/lala/index.html")
== "/etc/lala/index.html"
)
tl = lookup.TemplateLookup(directories=["./foo/bar"])
assert (
tl.filename_to_uri("./foo/bar/etc/index.html") == "/etc/index.html"
)
def test_uri_cache(self):
"""test that the _uri_cache dictionary is available"""
tl._uri_cache[("foo", "bar")] = "/some/path"
assert tl._uri_cache[("foo", "bar")] == "/some/path"
def test_check_not_found(self):
tl = lookup.TemplateLookup()
tl.put_string("foo", "this is a template")
f = tl.get_template("foo")
assert f.uri in tl._collection
f.filename = "nonexistent"
assert_raises_with_given_cause(
exceptions.TemplateLookupException,
FileNotFoundError,
tl.get_template,
"foo",
)
assert f.uri not in tl._collection
def test_dont_accept_relative_outside_of_root(self):
"""test the mechanics of an include where
the include goes outside of the path"""
tl = lookup.TemplateLookup(
directories=[os.path.join(config.template_base, "subdir")]
)
index = tl.get_template("index.html")
ctx = runtime.Context(FastEncodingBuffer())
ctx._with_template = index
assert_raises_message(
exceptions.TemplateLookupException,
'Template uri "../index.html" is invalid - it '
"cannot be relative outside of the root path",
runtime._lookup_template,
ctx,
"../index.html",
index.uri,
)
assert_raises_message(
exceptions.TemplateLookupException,
'Template uri "../othersubdir/foo.html" is invalid - it '
"cannot be relative outside of the root path",
runtime._lookup_template,
ctx,
"../othersubdir/foo.html",
index.uri,
)
# this is OK since the .. cancels out
runtime._lookup_template(ctx, "foo/../index.html", index.uri)
def test_checking_against_bad_filetype(self):
with tempfile.TemporaryDirectory() as tempdir:
tl = lookup.TemplateLookup(directories=[tempdir])
index_file = file_with_template_code(
os.path.join(tempdir, "index.html")
)
with rewind_compile_time():
tmpl = Template(filename=index_file)
tl.put_template("index.html", tmpl)
replace_file_with_dir(index_file)
assert_raises_with_given_cause(
exceptions.TemplateLookupException,
OSError,
tl._check,
"index.html",
tl._collection["index.html"],
)