from mako.template import Template from mako import lookup, exceptions, runtime from mako.util import FastEncodingBuffer from mako import compat from test.util import flatten_result, result_lines from test import eq_ import unittest import os from test import TemplateTest, template_base, module_base, assert_raises_message tl = lookup.TemplateLookup(directories=[template_base]) class LookupTest(unittest.TestCase): 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.""" self.assertRaises(exceptions.TopLevelLookupException, tl.get_template, "/subdir" ) def test_no_lookup(self): t = Template("hi <%include file='foo.html'/>") try: t.render() assert False except exceptions.TemplateLookupException: eq_( str(compat.exception_as()), "Template 'memory:%s' has no TemplateLookup associated" % \ hex(id(t)) ) 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" self.assertRaises(exceptions.TemplateLookupException, 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(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 t = runtime._lookup_template(ctx, "foo/../index.html", index.uri)