| import os |
| import unittest |
| |
| from mako import compat |
| from mako import exceptions |
| from mako import lookup |
| from mako import runtime |
| from mako.template import Template |
| from mako.util import FastEncodingBuffer |
| from test import assert_raises_message |
| from test import eq_ |
| from test import template_base |
| from test.util import result_lines |
| |
| 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 |
| runtime._lookup_template(ctx, "foo/../index.html", index.uri) |