cloud-init/cloudinit/tests/test_templating.py

138 lines
4.4 KiB
Python

# Copyright 2015 Canonical Ltd.
# This file is part of cloud-init. See LICENCE file for license information.
#
# vi: ts=4 expandtab
import fixtures
import mock
import os
import textwrap
from cloudinit import templater
from cloudinit.tests import TestCase
class TestTemplates(TestCase):
jinja_tmpl = '\n'.join((
"## template:jinja",
"{{a}},{{b}}",
""
))
jinja_params = {'a': '1', 'b': '2'}
jinja_expected = '1,2\n'
def test_render_basic(self):
in_data = textwrap.dedent("""
${b}
c = d
""")
in_data = in_data.strip()
expected_data = textwrap.dedent("""
2
c = d
""")
out_data = templater.basic_render(in_data, {'b': 2})
self.assertEqual(expected_data.strip(), out_data)
def test_render_jinja(self):
c = templater.render_string(self.jinja_tmpl, self.jinja_params)
self.assertEqual(self.jinja_expected, c)
def test_render_jinja_crlf(self):
blob = '\r\n'.join((
"## template:jinja",
"{{a}},{{b}}"))
c = templater.render_string(blob, {"a": 1, "b": 2})
self.assertEqual("1,2", c)
def test_render_default(self):
blob = '''$a,$b'''
c = templater.render_string(blob, {"a": 1, "b": 2})
self.assertEqual("1,2", c)
def test_render_explict_default(self):
blob = '\n'.join(('## template: basic', '$a,$b',))
c = templater.render_string(blob, {"a": 1, "b": 2})
self.assertEqual("1,2", c)
def test_render_basic_deeper(self):
hn = 'myfoohost.yahoo.com'
expected_data = "h=%s\nc=d\n" % hn
in_data = "h=$hostname.canonical_name\nc=d\n"
params = {
"hostname": {
"canonical_name": hn,
},
}
out_data = templater.render_string(in_data, params)
self.assertEqual(expected_data, out_data)
def test_render_basic_no_parens(self):
hn = "myfoohost"
in_data = "h=$hostname\nc=d\n"
expected_data = "h=%s\nc=d\n" % hn
out_data = templater.basic_render(in_data, {'hostname': hn})
self.assertEqual(expected_data, out_data)
def test_render_basic_parens(self):
hn = "myfoohost"
in_data = "h = ${hostname}\nc=d\n"
expected_data = "h = %s\nc=d\n" % hn
out_data = templater.basic_render(in_data, {'hostname': hn})
self.assertEqual(expected_data, out_data)
def test_render_basic2(self):
mirror = "mymirror"
codename = "zany"
in_data = "deb $mirror $codename-updates main contrib non-free"
ex_data = "deb %s %s-updates main contrib non-free" % (mirror,
codename)
out_data = templater.basic_render(
in_data, {'mirror': mirror, 'codename': codename})
self.assertEqual(ex_data, out_data)
def test_render_basic_exception_1(self):
in_data = "h=${foo.bar}"
self.assertRaises(
TypeError, templater.basic_render, in_data, {'foo': [1, 2]})
def test_unknown_renderer_raises_exception(self):
blob = '\n'.join((
"## template:bigfastcat",
"Hellow $name"
""))
self.assertRaises(
ValueError, templater.render_string, blob, {'name': 'foo'})
@mock.patch.object(templater, 'JINJA_AVAILABLE', False)
def test_jinja_without_jinja_raises_exception(self):
blob = '\n'.join((
"## template:jinja",
"Hellow {{name}}"
""))
templater.JINJA_AVAILABLE = False
self.assertRaises(
ValueError, templater.render_string, blob, {'name': 'foo'})
def test_render_from_file(self):
td = self.useFixture(fixtures.TempDir()).path
fname = os.path.join(td, "myfile")
with open(fname, "w") as fp:
fp.write(self.jinja_tmpl)
rendered = templater.render_from_file(fname, self.jinja_params)
self.assertEqual(rendered, self.jinja_expected)
def test_render_to_file(self):
td = self.useFixture(fixtures.TempDir()).path
src = os.path.join(td, "src")
target = os.path.join(td, "target")
with open(src, "w") as fp:
fp.write(self.jinja_tmpl)
templater.render_to_file(src, target, self.jinja_params)
with open(target, "r") as fp:
rendered = fp.read()
self.assertEqual(rendered, self.jinja_expected)